void URcontrolcenter::start() { // 创建六个线程 for (int i = 0; i < 6; ++i) { threads.push_back(std::thread(&URcontrolcenter::processTasks, this));//六个线程同时运行 } // 等待所有任务完成 std::unique_lockstd::mutex lock(mutex); conditionVariable.wait(lock, this{ return tasksCompleted == relationship_list.size(); }); }void URcontrolcenter::processTasks() { RewriteRelationShip relationship; while (true) { // 获取下一个任务 int taskNumber; { std::lock_guardstd::mutex lock(mutex);//使用线程锁确保线程安全 if (currentTask > relationship_list.size()) { // 所有任务已完成,退出循环,好家伙,上下应该是同步接收信号,但下面能把最后一个信号发送出去吗 return; } taskNumber = currentTask++; } // 处理任务 relationship.parseData(relationship_list[shipid],worningcrosstype);//应该输入直接带relationship的 shipid++; // 发送完成信号 { std::lock_guardstd::mutex lock(mutex);//这个367也应该由QDir。。查出来 ++tasksCompleted; if (tasksCompleted == relationship_list.size()) { // 所有任务已完成,通知等待线程 conditionVariable.notify_one(); } } } }上述函数只有一个线程完成了一个任务,分析原因,给出修改后的代码
时间: 2024-02-02 21:02:42 浏览: 111
经过分析,原因是任务分配不均,只有一个线程在不断地处理任务,其他线程一直处于空闲状态。为了解决这个问题,可以将任务分配方式改为按照线程数平均分配任务,使得每个线程都有任务可以处理。
修改后的代码如下:
```
void URcontrolcenter::start() {
// 创建六个线程
for (int i = 0; i < 6; ++i) {
threads.push_back(std::thread(&URcontrolcenter::processTasks, this));
}
// 等待所有任务完成
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::lock_guard<std::mutex> lock(mutex);
if (currentTask >= relationship_list.size()) {
// 所有任务已完成,退出循环
return;
}
taskNumber = currentTask;
currentTask++;
}
// 处理任务
relationship.parseData(relationship_list[taskNumber], worningcrosstype);
// 发送完成信号
{
std::lock_guard<std::mutex> lock(mutex);
tasksCompleted++;
if (tasksCompleted == relationship_list.size()) {
// 所有任务已完成,通知等待线程
conditionVariable.notify_one();
}
}
}
}
```
在修改后的代码中,我们将任务分配方式改为按照线程数平均分配任务。具体来说,每个线程会从任务列表中获取一个编号为`currentTask`的任务,并将`currentTask`加一。这样可以确保每个线程都有任务可以处理,提高了程序的并发性能。
阅读全文