void URcontrolcenter::start() { // 创建六个线程 for (int i = 0; i < 6; ++i) { threads.push_back(std::thread(&URcontrolcenter::processTasks, this)); } // 将任务分配到队列中 for (int i = 0; i < relationship_list.size(); ++i) { taskQueue.push(i); } // 等待所有任务完成 std::unique_lock<std::mutex> lock(mutex); conditionVariable.wait(lock, [this]() { return tasksCompleted == relationship_list.size(); }); } void URcontrolcenter::processTasks() { // 下面先报完成,然后下一轮上面给弹出 RewriteRelationShip relationship; int taskNumber; while (true) { // 获取下一个任务 { std::unique_lock<std::mutex> lock(mutex); if (taskQueue.empty()) { // 检查当前任务是否已经全部完成,如果已经完成,则退出循环,否则获取下一个任务,并处理该任务。 return; } taskNumber = taskQueue.front(); taskQueue.pop(); } // 处理任务 relationship.parseData(relationship_list[taskNumber], worningcrosstype); // 在任务完成后,增加了已完成任务的数量,并检查是否所有任务都已经完成。如果所有任务都已经完成,则调用conditionVariable.notify_one()函数,通知等待线程可以继续执行。 ++tasksCompleted; if (tasksCompleted == relationship_list.size()) { std::unique_lock<std::mutex> lock(mutex); conditionVariable.notify_one(); } } } 这段代码,需要使用std::atomic保证tasksCompleted的原子性,给出变量定义
时间: 2024-02-14 12:03:57 浏览: 90
线程创建-Unix/Linux C/C++编程学习
需要将 `tasksCompleted` 定义为 `std::atomic<int>`,如下所示:
```c++
std::atomic<int> tasksCompleted{0};
```
这里使用了花括号初始化的方式,将 `tasksCompleted` 初始化为0。由于 `std::atomic` 类型的对象可以直接使用赋值运算符进行赋值,因此在后续的代码中可以直接使用 `++tasksCompleted;` 对其进行原子加1操作。
阅读全文