gpt4 book ai didi

c++ - 一个线程等待多个线程的信号机制

转载 作者:行者123 更新时间:2023-11-28 05:34:59 25 4
gpt4 key购买 nike

我正在设计一个系统,其中一组工作人员从队列中弹出作业,我希望主线程等待所有这些工作完成。这是我到目前为止想出的(伪代码):

// Main
launch_signal();
for (auto &worker : pool) {
// create unique_lock
if (!worker.done)
worker.condition_variable.wait(lock, worker.done);
}

// Worker
if (queue.empty()) {
mutex.lock();
this->done = true;
mutex.unlock();
this->condition_variable.notify_one();
// wait for launch signal from Main
} else {
mutex.lock();
auto job = queue.pop();
mutex.unlock();
job.execute();
}

因此 Main 发出工作可用的信号,然后等待每个工作人员发回信号。 Worker 同时不断地从队列中弹出作业直到空,然后发出完成信号并进入等待启动信号。

我的问题:执行此操作的更有效算法是什么?

最佳答案

现有代码似乎可以在不持有互斥锁的情况下访问 queue.empty()。除非 queue 对象本身是线程安全的,(或者至少 queue.empty() 方法被明确记录为线程安全的),这将是未定义的行为.

所以第一个改进是修复这个可能的错误。

否则,这是一个相当普通的、经过实战检验的工作池实现。这里没有太大的改进空间。

我唯一可以提出的建议是,如果工作线程的数量是N,并且在锁定互斥锁之后,线程发现队列中有J 个作业, 线程可以立即从队列中删除 J/N 个作业(除法的结果至少为 1),然后按顺序执行它们,假设所有其他线程都将做同样的事情,平均而言,工作需要大约相同的时间来完成。这将最大限度地减少锁争用。

关于c++ - 一个线程等待多个线程的信号机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38526618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com