以一个简单的例子说明,c++循环创建多个线程,并且保证一次同时存在10个线程,否则不再增加新的线程直到有线程结束
时间: 2024-12-13 13:27:42 浏览: 3
在C++中,我们可以使用`std::condition_variable`和`std::mutex`配合`std::vector<std::thread>`来实现这种动态创建线程和控制线程数的功能。以下是一个简单的示例:
```cpp
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 用于保护队列和条件变量
std::condition_variable cond; // 信号量,等待新线程加入
int max_threads = 10;
std::vector<std::thread> threads; // 存储线程
void worker(int id) {
std::lock_guard<std::mutex> lock(mtx);
// 这里替换为你实际的任务代码
for (int i = 0; i < 10000; ++i) {
std::cout << "Worker " << id << ": Thread ID " << this_thread::get_id() << "\n";
}
// 模拟工作完成,通知主线程可以关闭线程
cond.notify_one();
}
void create_workers() {
while (threads.size() < max_threads) {
if (threads.empty()) { // 等待队列为空或者现有线程都结束
cond.wait(lock, []{ return threads.empty(); });
}
threads.emplace_back(worker, threads.size());
}
}
int main() {
create_workers();
for (auto& thread : threads) {
thread.join(); // 等待所有线程结束后关闭队列
}
std::cout << "All workers finished.\n";
return 0;
}
```
这个程序会在`create_workers`函数中创建不超过`max_threads`数量的线程。每当新线程开始执行前,它会检查当前是否有空闲位置。如果没有,则主线程会等待`cond`,直到有线程完成退出。这样就实现了控制线程数量的目的。
阅读全文