使用std::互斥对象的数组时,Conditional_variable不会触发
conditional_variable does not trigger when using array of std::mutex
此应用程序是递归多线程分离的应用程序。每个线程重新生成在它死之前有一堆新的线程。选项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
来删除数据竞争。
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++ Singleton - Prevent ::instance() to variable
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- C++中是否存在 std::conditional 的懒惰等价物?
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- C++:寻找"returning address of local variable..."的更正
- C++ - 在我尝试制作一个简单的计算器时有一个"uninitialized local variable y used"警告
- Visual Studio Code "variable " u8 的 C/C++ 扩展名 " " 不是类型名称"
- C++ "Using Uninitialized Memory.. (variable name) "
- cudaMallocManaged for host-initiated variable
- Cppcheck "Reference to auto variable returned"失败的原因?
- 使用std::conditional中的模板来确定函数参数类型
- OpenCV 和 C++:"Can't resolve variable 'Mat`"
- 是否有用于"go to variable type definition" C++中"auto"变量的 Visual Studio 键盘快捷方式?
- 冲刺错误"variable may be unsafe" (C4996)...选择?
- 如何在 GCC 中启用 C/C++ "Conditional with Omitted Operand"(又名猫王操作员 "?:" )
- Visual Studio生成"Error: uninitialized local variable 'x' "而在线编译器不会 - 为什么?
- GUID variable for JPEG,BMP,PNG