25#ifndef LMMS_THREAD_POOL_H
26#define LMMS_THREAD_POOL_H
34#include <condition_variable>
49 template <
typename Fn,
typename... Args>
50 auto enqueue(Fn&&
fn, Args&&... args) -> std::future<std::invoke_result_t<Fn, Args...>>
52 using ReturnType = std::invoke_result_t<Fn, Args...>;
54 auto promise = std::make_shared<std::promise<ReturnType>>();
55 auto task = [promise,
fn = std::forward<Fn>(
fn), args = std::make_tuple(std::forward<Args>(args)...)]
57 if constexpr (!std::is_same_v<ReturnType, void>)
59 promise->set_value(std::apply(
fn, args));
67 const auto lock = std::unique_lock{
m_runMutex};
72 return promise->get_future();
pthread_mutex_t mutex
Definition Controller.C:6
static void run(LV2_Handle instance, uint32_t n_samples)
Definition bindings_test_plugin.c:112
A thread pool that can be used for asynchronous processing.
Definition ThreadPool.h:42
auto numWorkers() const -> size_t
Return the number of worker threads used.
Definition ThreadPool.cpp:55
std::atomic< bool > m_done
Definition ThreadPool.h:86
auto enqueue(Fn &&fn, Args &&... args) -> std::future< std::invoke_result_t< Fn, Args... > >
Enqueue function fn with arguments args to be ran asynchronously.
Definition ThreadPool.h:50
std::queue< std::function< void()> > m_queue
Definition ThreadPool.h:85
static auto instance() -> ThreadPool &
Return the global ThreadPool instance.
Definition ThreadPool.cpp:77
~ThreadPool()
Definition ThreadPool.cpp:40
std::vector< std::thread > m_workers
Definition ThreadPool.h:84
ThreadPool(size_t numWorkers)
Definition ThreadPool.cpp:29
std::mutex m_runMutex
Definition ThreadPool.h:88
std::condition_variable m_runCond
Definition ThreadPool.h:87
static size_t s_numWorkers
Definition ThreadPool.h:89
Definition AudioAlsa.cpp:35
Definition juce_Uuid.h:141
#define false
Definition ordinals.h:83
const char const char const char const char char * fn
Definition swell-functions.h:168
#define const
Definition zconf.h:137