条件变量wait抛出异常

时间:2017-01-11 15:40:31

标签: c++ linux gcc

以下代码在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)

1 个答案:

答案 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宏。