该应用程序是递归多线程分离的应用程序。每个线程都会重新生成 在它死之前新的一堆线程。 选项 1(有效),但它是共享资源,因此会减慢应用程序的速度。 选项 2 应该可以消除这个瓶颈。
选项 1 有效:
std::condition_variable cv;
bool ready = false;
std::mutex mu;
// go triggers the thread's function
void go() {
std::unique_lock<std::mutex> lck( mu );
ready = true;
cv.notify_all();
}
void ThreadFunc ( ...) {
std::unique_lock<std::mutex> lck ( mu );
cv.wait(lck, []{return ready;});
do something useful
}
选项 2 不会触发线程:
std::array<std::mutex, DUToutputs*MaxGnodes> arrMutex ;
void go ( long m , long Channel )
{
std::unique_lock<std::mutex> lck( arrMutex[m+MaxGnodes*Channel] );
ready = true;
cv.notify_all();
}
void ThreadFunc ( ...) {
std::unique_lock<std::mutex> lck ( arrMutex[Inst+MaxGnodes*Channel] );
while (!ready) cv.wait(lck);
do something useful
}
如何使选项 #2 发挥作用?
最佳答案
选项 2 中的代码包含变量 ready
上的所谓数据竞争。 ,因为对该变量的读写操作不再同步。具有数据竞争的程序的行为是未定义的。您可以通过更改 bool ready
来消除数据争用至std::atomic<bool> ready
.
这应该已经解决了选项 2 中的问题。但是,如果您使用 std::atomic
,还可以进行其他优化:
std::atomic<bool> ready{false};
void go(long m, long Channel) {
// no lock required
ready = true;
cv.notify_all();
}
void ThreadFunc( ...) {
std::unique_lock<std::mutex> lck(arrMutex[Inst+MaxGnodes*Channel]);
cv.wait(lck, [] { return ready; });
// do something useful
}
关于c++ - 使用 std::mutex 数组时,条件变量不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24726448/