// Copyright 2019 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_TASK_THREAD_POOL_H_ #define BASE_TASK_THREAD_POOL_H_ #include <memory> #include <utility> #include "base/base_export.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/location.h" #include "base/memory/scoped_refptr.h" #include "base/task/post_task_and_reply_with_result_internal.h" #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" #include "base/task/single_thread_task_runner_thread_mode.h" #include "base/task/task_runner.h" #include "base/task/task_traits.h" #include "base/task/updateable_sequenced_task_runner.h" #include "base/time/time.h" #include "build/build_config.h" namespace base { // This is the interface to post tasks to base's thread pool. // // To post a simple one-off task with default traits: // base::ThreadPool::PostTask(FROM_HERE, base::BindOnce(...)); // // To post a high priority one-off task to respond to a user interaction: // base::ThreadPool::PostTask( // FROM_HERE, // {base::TaskPriority::USER_BLOCKING}, // base::BindOnce(...)); // // To post tasks that must run in sequence with default traits: // scoped_refptr<SequencedTaskRunner> task_runner = // base::ThreadPool::CreateSequencedTaskRunner(); // task_runner->PostTask(FROM_HERE, base::BindOnce(...)); // task_runner->PostTask(FROM_HERE, base::BindOnce(...)); // // To post tasks that may block, must run in sequence and can be skipped on // shutdown: // scoped_refptr<SequencedTaskRunner> task_runner = // base::ThreadPool::CreateSequencedTaskRunner( // {MayBlock(), TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); // task_runner->PostTask(FROM_HERE, base::BindOnce(...)); // task_runner->PostTask(FROM_HERE, base::BindOnce(...)); // // The default traits apply to tasks that: // (1) don't block (ref. MayBlock() and WithBaseSyncPrimitives()), // (2) prefer inheriting the current priority to specifying their own, and // (3) can either block shutdown or be skipped on shutdown // (implementation is free to choose a fitting default). // Explicit traits must be specified for tasks for which these loose // requirements are not sufficient. // // Prerequisite: A ThreadPoolInstance must have been registered for the current // process via ThreadPoolInstance::Set() before the API below can be invoked. // This is typically done during the initialization phase in each process. If // your code is not running in that phase, you most likely don't have to worry // about this. You will encounter DCHECKs or nullptr dereferences if this is // violated. For tests, use base::test::TaskEnvironment. class BASE_EXPORT ThreadPool { … }; } // namespace base #endif // BASE_TASK_THREAD_POOL_H_