c++实现线程池打印随机数
时间: 2023-09-01 08:07:44 浏览: 101
下面是一个简单的 C++ 线程池实现,用于打印随机数:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
class ThreadPool {
public:
ThreadPool(size_t num_threads) {
for (size_t i = 0; i < num_threads; ++i) {
threads.emplace_back([this] {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(m_queue_mutex);
m_cond.wait(lock, [this] { return !m_tasks.empty() || m_stop; });
if (m_stop && m_tasks.empty()) {
return;
}
task = std::move(m_tasks.front());
m_tasks.pop();
}
task();
}
});
}
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(m_queue_mutex);
m_stop = true;
}
m_cond.notify_all();
for (auto& thread : threads) {
thread.join();
}
}
template<class F, class... Args>
void enqueue(F&& f, Args&&... args) {
{
std::unique_lock<std::mutex> lock(m_queue_mutex);
m_tasks.emplace([=] { return f(args...); });
}
m_cond.notify_one();
}
private:
std::vector<std::thread> threads;
std::queue<std::function<void()>> m_tasks;
std::mutex m_queue_mutex;
std::condition_variable m_cond;
bool m_stop = false;
};
int main() {
ThreadPool pool(4);
for (int i = 0; i < 10; ++i) {
pool.enqueue([] {
std::cout << "Thread ID: " << std::this_thread::get_id() << ", Random Number: " << rand() << std::endl;
});
}
return 0;
}
```
该线程池实现了一个简单的任务队列和多个线程。当有任务加入到队列中时,一个空闲线程会被唤醒并执行该任务。在程序中,我们使用 `enqueue` 函数将任务加入到队列中,每个任务都是一个 lambda 函数,用于打印当前线程的 ID 和一个随机数。在主函数中,我们创建了一个线程池并将 10 个任务加入到任务队列中。
阅读全文