Index: base/threading/thread.h |
diff --git a/base/threading/thread.h b/base/threading/thread.h |
index d7451ec58ab9238db1b434c4944523a0180e2506..2ee4fa27fdc57e0beda14f976a28e3db00412987 100644 |
--- a/base/threading/thread.h |
+++ b/base/threading/thread.h |
@@ -21,6 +21,8 @@ namespace base { |
// pending tasks queued on the thread's message loop will run to completion |
// before the thread is terminated. |
// |
+// NOTE: Subclasses must call Stop() in their destructor. See ~Thread below. |
+// |
// After the thread is stopped, the destruction sequence is: |
// |
// (1) Thread::CleanUp() |
@@ -48,9 +50,13 @@ class BASE_EXPORT Thread : PlatformThread::Delegate { |
// Destroys the thread, stopping it if necessary. |
// |
- // NOTE: If you are subclassing from Thread, and you wish for your CleanUp |
- // method to be called, then you need to call Stop() from your destructor. |
- // |
+ // NOTE: All subclasses of Thread must call Stop() in their |
+ // destructor, or otherwise ensure Stop() is called before the |
+ // subclass is destructed. This is required to avoid a data race |
+ // between the destructor modifying the vtable, and the thread's |
+ // ThreadMain calling the virtual method Run. It also ensures that |
+ // the CleanUp() virtual method is called on the subclass before it |
+ // is destructed. |
virtual ~Thread(); |
// Starts the thread. Returns true if the thread was successfully started; |