//===-- llvm/Support/ThreadPool.h - A ThreadPool implementation -*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines a crude C++11 based thread pool. // //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_THREADPOOL_H #define LLVM_SUPPORT_THREADPOOL_H #include "llvm/ADT/DenseMap.h" #include "llvm/Config/llvm-config.h" #include "llvm/Support/RWMutex.h" #include "llvm/Support/Threading.h" #include "llvm/Support/thread.h" #include <future> #include <condition_variable> #include <deque> #include <functional> #include <memory> #include <mutex> #include <utility> namespace llvm { class ThreadPoolTaskGroup; /// This defines the abstract base interface for a ThreadPool allowing /// asynchronous parallel execution on a defined number of threads. /// /// It is possible to reuse one thread pool for different groups of tasks /// by grouping tasks using ThreadPoolTaskGroup. All tasks are processed using /// the same queue, but it is possible to wait only for a specific group of /// tasks to finish. /// /// It is also possible for worker threads to submit new tasks and wait for /// them. Note that this may result in a deadlock in cases such as when a task /// (directly or indirectly) tries to wait for its own completion, or when all /// available threads are used up by tasks waiting for a task that has no thread /// left to run on (this includes waiting on the returned future). It should be /// generally safe to wait() for a group as long as groups do not form a cycle. class ThreadPoolInterface { … }; #if LLVM_ENABLE_THREADS /// A ThreadPool implementation using std::threads. /// /// The pool keeps a vector of threads alive, waiting on a condition variable /// for some work to become available. class StdThreadPool : public ThreadPoolInterface { … }; #endif // LLVM_ENABLE_THREADS /// A non-threaded implementation. class SingleThreadExecutor : public ThreadPoolInterface { … }; #if LLVM_ENABLE_THREADS DefaultThreadPool; #else using DefaultThreadPool = SingleThreadExecutor; #endif /// A group of tasks to be run on a thread pool. Thread pool tasks in different /// groups can run on the same threadpool but can be waited for separately. /// It is even possible for tasks of one group to submit and wait for tasks /// of another group, as long as this does not form a loop. class ThreadPoolTaskGroup { … }; } // namespace llvm #endif // LLVM_SUPPORT_THREADPOOL_H