// Copyright 2011 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // WARNING: You should probably be using Thread (thread.h) instead. Thread is // Chrome's message-loop based Thread abstraction, and if you are a // thread running in the browser, there will likely be assumptions // that your thread will have an associated message loop. // // This is a simple thread interface that backs to a native operating system // thread. You should use this only when you want a thread that does not have // an associated MessageLoop. Unittesting is the best example of this. // // The simplest interface to use is DelegateSimpleThread, which will create // a new thread, and execute the Delegate's virtual Run() in this new thread // until it has completed, exiting the thread. // // NOTE: You *MUST* call Join on the thread to clean up the underlying thread // resources. You are also responsible for destructing the SimpleThread object. // It is invalid to destroy a SimpleThread while it is running, or without // Start() having been called (and a thread never created). The Delegate // object should live as long as a DelegateSimpleThread. // // Thread Safety: A SimpleThread is not completely thread safe. It is safe to // access it from the creating thread or from the newly created thread. This // implies that the creator thread should be the thread that calls Join. // // Example: // class MyThreadRunner : public DelegateSimpleThread::Delegate { ... }; // MyThreadRunner runner; // DelegateSimpleThread thread(&runner, "good_name_here"); // thread.Start(); // // Start will return after the Thread has been successfully started and // // initialized. The newly created thread will invoke runner->Run(), and // // run until it returns. // thread.Join(); // Wait until the thread has exited. You *MUST* Join! // // The SimpleThread object is still valid, however you may not call Join // // or Start again. #ifndef BASE_THREADING_SIMPLE_THREAD_H_ #define BASE_THREADING_SIMPLE_THREAD_H_ #include <stddef.h> #include <memory> #include <string> #include <vector> #include "base/base_export.h" #include "base/compiler_specific.h" #include "base/containers/queue.h" #include "base/memory/raw_ptr.h" #include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" #include "base/threading/platform_thread.h" namespace base { // This is the base SimpleThread. You can derive from it and implement the // virtual Run method, or you can use the DelegateSimpleThread interface. // SimpleThread should not be used to run a MessagePump, `base::Thread` must be // used for that. class BASE_EXPORT SimpleThread : public PlatformThread::Delegate { … }; // A SimpleThread which delegates Run() to its Delegate. Non-joinable // DelegateSimpleThread are safe to delete after Run() was invoked, their // Delegates are also safe to delete after that point from this class' point of // view (although implementations must of course make sure that Run() will not // use their Delegate's member state after its deletion). class BASE_EXPORT DelegateSimpleThread : public SimpleThread { … }; // DelegateSimpleThreadPool allows you to start up a fixed number of threads, // and then add jobs which will be dispatched to the threads. This is // convenient when you have a lot of small work that you want done // multi-threaded, but don't want to spawn a thread for each small bit of work. // // You just call AddWork() to add a delegate to the list of work to be done. // JoinAll() will make sure that all outstanding work is processed, and wait // for everything to finish. You can reuse a pool, so you can call Start() // again after you've called JoinAll(). class BASE_EXPORT DelegateSimpleThreadPool : public DelegateSimpleThread::Delegate { … }; } // namespace base #endif // BASE_THREADING_SIMPLE_THREAD_H_