gpt4 book ai didi

c++ - 使用 std::mutex 数组时不会触发 conditional_variable

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:42 26 4
gpt4 key购买 nike

这个应用程序是递归的多线程分离器。每个线程重新生成新的一堆线程在它死之前。选项 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 数组时不会触发 conditional_variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24726448/

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