c++ - 使用 std::mutex 数组时,条件变量不会触发

标签 c++ multithreading c++11

该应用程序是递归多线程分离的应用程序。每个线程都会重新生成 在它死之前新的一堆线程。 选项 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/

相关文章:

c++ - 不稳定类型特征背后的原因是什么?

c++ - 警告 : statement has no effect (C++)

java后台任务

java - 在java : possible?中手动触发CPU缓存写回有必要吗?

c++ - std::thread 请解释输出

c++ - 使用继承而不是 typedef 来实现前向可声明性和回调带来的复杂性

c++ - 视频和音频帧的 PTS 和 DTS 计算

c++ - 从 SVN 编译 Opencv

c++ - 返回类型模板(enable_if)禁止什么?

c++ - 查找多重集中小于或等于 k ​​的元素数