以下代码在setupVar.wait行抛出一个std :: system_error。奇怪的是,这种情况间歇性地发生 - 通过删除一些代码行,它将成功运行 - 尽管并非总是如此。请注意,这是从较大的代码块中删除的,所以我想要它做的就是停止并等待。
我使用dev-toolset2(gcc 4.8.2)在CentOS 6中构建和运行,使用以下命令(代码在Test2.cpp文件中):
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -pthread -m64 -o"src/Test2.o" "../src/Test2.cpp"
g++ -Wl,--no-as-needed -lpthread -o Test2 ./src/Test2.o
另一个奇怪的是,这在CentOS 7(gcc 4.8.5)中完全正常。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <unistd.h>
using namespace std;
int main() {
cout << "!!!Start!!!" << endl;
bool flag = false;
std::timed_mutex setupMtx;
std::condition_variable_any setupVar;
std::unique_lock<std::timed_mutex> setupLock(setupMtx);
std::thread theThread(
[&flag]
{
cout << "!!!In thread!!!" << endl;
flag = true;
}
);
sleep(1);
setupVar.wait(setupLock);
theThread.join();
cout << "!!!End!!!" << endl;
return 0;
}
当我跑步时,我得到:
!!!Start!!!
!!!In thread!!!
terminate called after throwing an instance of 'std::system_error'
what():
Aborted (core dumped)
代码本身是否有任何错误会导致if在setupVar.wait中抛出异常?有没有人对可能导致这个问题的原因有任何其他想法?
只是为了进一步了解,在输出exe上运行ldd会给出:
linux-vdso.so.1 => (0x00007ffc37968000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034a8c00000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000034b2c00000)
libm.so.6 => /lib64/libm.so.6 (0x00000034a8800000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000034b2000000)
libc.so.6 => /lib64/libc.so.6 (0x00000034a8400000)
/lib64/ld-linux-x86-64.so.2 (0x00000034a7c00000)
答案 0 :(得分:0)
这是https://rhn.redhat.com/errata/RHBA-2014-1035.html中列出的错误的一种表现形式,因为我已经安装了devtoolset-2-gcc软件包(我实际上是从CERN获得的),这是一个简单的方法来获取CentOS上的gcc 4.8 6。
从上面的链接引用:
- 以前,&#34; std :: condition_variable_any&#34;定义了C ++ 11类型 在GCC中不正确。因此,编译了Red Hat Developer Toolset代码 使用更高版本的libstdc ++可能无法在具有旧版本的系统上运行 该库的版本。头文件已更新且仅包含标头 &#34; condition_variable_any&#34;已添加用于 _GLIBCXX_DTS2_CONDITION_VARIABLE_ANY宏。定义宏时,编译 适用于任何版本的libstdc ++。 (BZ#1120929)
因此解决方案是在包含condition_variable之前定义_GLIBCXX_DTS2_CONDITION_VARIABLE_ANY宏。