gpt4 book ai didi

c++ - std::condition_variable 仅在调试时有效?

转载 作者:行者123 更新时间:2023-11-30 05:00:42 25 4
gpt4 key购买 nike

我用 C++14 写了一个项目,在 Fedora 26 上用 Intel 的 icpc 编译(依赖 gcc 7)。一切都很好并且工作正常,直到我将我的项目转移到 Centos 7 上,并开始遇到非常神秘的行为。

在Centos (scl enable devtoolset-7 bash) 上,源代码编译和链接没有错误,但项目只能在使用GDB 调试时运行。如果不进行调试,条件变量唤醒休眠线程的通知将不起作用。

多个工作线程进入休眠状态,但通知不起作用,也没有唤醒。但是使用 GDB 运行,一切正常。

我禁用了所有优化。我尝试静态链接 libstdc++ 和 libgcc,但没有任何效果。我尝试了一个小测试程序,condition_variable 工作正常。我还测试了 Fedora 27,它解决了这个问题。

这是一个例子:

    // worker thread
// term and cv passed in with std::ref()
std::atomic<bool> &_terminate = term;
std::condition_variable &_dataConditionVar = cv;
std::mutex acctMutex;

while (!_terminate.load(std::memory_order_relaxed)) {
// do stuff here ....

// wait for notification
std::unique_lock<std::mutex> acctLock(acctMutex);
_dataConditionVar.wait(acctLock); // Thread never wakes up <<
}

适用于 Fedora 26/27 但不适用于 Centos 7。有人对如何进行有任何建议吗?

最佳答案

如果_terminate_terminate.load(std::memory_order_relaxed) 之后设置但在 std::unique_lock<std::mutex> acctLock(acctMutex); 之前, _dataConditionVar.wait(acctLock)可能永远阻塞。

您不想使用 std::atomicstd::mutexstd::condition_variable因为这样的用法通常会导致这种竞争条件。通常,您可以使用 std::atomicstd::mutex/std::condition_variable .

正确的用法是使_terminate普通 bool并仅在持有互斥量时访问它:

bool _terminate = false;
std::condition_variable _dataConditionVar;
std::mutex acctMutex;

// Set _terminate example.
{
std::unique_lock<std::mutex> acctLock(acctMutex);
_terminate = true;
_dataConditionVar.notify_one();
}

// Wait for _terminate to be set example.
{
std::unique_lock<std::mutex> acctLock(acctMutex);
while(!_terminate)
_dataConditionVar.wait(acctLock);
}

关于c++ - std::condition_variable 仅在调试时有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50629479/

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