将 多个某个函数执行加入到任务队列使用一个 std::thread 执行,如果任务队列无任务则空转、
时间: 2024-05-13 15:16:00 浏览: 17
可以使用一个循环来实现任务队列的自动执行,代码如下:
```c++
#include <iostream>
#include <queue>
#include <functional>
#include <thread>
#include <mutex>
#include <condition_variable>
std::queue<std::function<void()>> task_queue;
std::mutex task_mutex;
std::condition_variable task_cv;
void worker_thread() {
while (true) {
std::unique_lock<std::mutex> ul(task_mutex);
task_cv.wait(ul, [](){ return !task_queue.empty(); });
auto task = task_queue.front();
task_queue.pop();
ul.unlock();
task();
}
}
void add_task(std::function<void()> task) {
std::lock_guard<std::mutex> lg(task_mutex);
task_queue.push(task);
task_cv.notify_all();
}
int main() {
std::thread t(worker_thread);
for (int i = 0; i < 10; ++i) {
add_task([](){
std::cout << "Task executed by thread " << std::this_thread::get_id() << std::endl;
});
}
t.join();
return 0;
}
```
在这个例子中,我们创建了一个 `task_queue` 用于存储任务,一个 `task_mutex` 用于保护任务队列,一个 `task_cv` 用于线程间的通信。`worker_thread` 函数是工作线程,在一个无限循环中,它会等待任务队列非空,然后从任务队列中取出一个任务并执行。`add_task` 函数用于添加任务到任务队列中。
在主函数中,我们创建了一个工作线程,并添加了 10 个任务到任务队列中。当任务队列中有任务时,工作线程会自动执行任务,否则会等待新的任务加入。在本例中,我们只使用了一个工作线程,但实际应用中可以根据需要创建多个工作线程。