// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_THREADING_THREAD_H_ #define BASE_THREADING_THREAD_H_ #include <stddef.h> #include <memory> #include <string> #include "base/base_export.h" #include "base/check.h" #include "base/compiler_specific.h" #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" #include "base/message_loop/message_pump_type.h" #include "base/sequence_checker.h" #include "base/synchronization/atomic_flag.h" #include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/platform_thread.h" #include "build/build_config.h" namespace base { class MessagePump; class RunLoop; // IMPORTANT: Instead of creating a base::Thread, consider using // base::ThreadPool::Create(Sequenced|SingleThread)TaskRunner(). // // A simple thread abstraction that establishes a MessageLoop on a new thread. // The consumer uses the MessageLoop of the thread to cause code to execute on // the thread. When this object is destroyed the thread is terminated. All // pending tasks queued on the thread's message loop will run to completion // before the thread is terminated. // // WARNING! SUBCLASSES MUST CALL Stop() IN THEIR DESTRUCTORS! See ~Thread(). // // After the thread is stopped, the destruction sequence is: // // (1) Thread::CleanUp() // (2) MessageLoop::~MessageLoop // (3.b) CurrentThread::DestructionObserver::WillDestroyCurrentMessageLoop // // This API is not thread-safe: unless indicated otherwise its methods are only // valid from the owning sequence (which is the one from which Start() is // invoked -- should it differ from the one on which it was constructed). // // Sometimes it's useful to kick things off on the initial sequence (e.g. // construction, Start(), task_runner()), but to then hand the Thread over to a // pool of users for the last one of them to destroy it when done. For that use // case, Thread::DetachFromSequence() allows the owning sequence to give up // ownership. The caller is then responsible to ensure a happens-after // relationship between the DetachFromSequence() call and the next use of that // Thread object (including ~Thread()). class BASE_EXPORT Thread : PlatformThread::Delegate { … }; } // namespace base #endif // BASE_THREADING_THREAD_H_