不应该std :: thread :: id默认构造函数创建一个"NULL"id吗?

And*_*uel 7 c++ linux gcc c++11

我的gcc版本4.8.0中的以下代码失败:

#include <thread>
#include <cassert>

int main() {
    std::thread::id nobody;

    assert( nobody != std::this_thread::get_id() );
};
Run Code Online (Sandbox Code Playgroud)

这种行为是否正确?

Ali*_*Ali 7

更新: Jonathan Wakely亲切地看着他说的问题(在评论中),-pthread必须传递给编译器和链接器.如果我这样做,代码也不会失败,使用gcc 4.7.2.所以答案显然与引用的电子邮件无关.谢谢乔纳森!


以下是gcc开发人员Jonathan Wakely在2011年撰写的一些报价:

我们的std :: thread :: id上的所有比较运算符都依赖于未定义的行为,因为我们的thread :: id只是一个pthread_t.

[...]

2)operator ==使用pthread_equal,对于无效的线程ID未定义,POSIX说:

   If either t1 or t2 are not valid thread IDs, the behavior is undefined.
Run Code Online (Sandbox Code Playgroud)
虽然它是两年前写的,但它可能仍然适用.目前我无法检查gcc代码库来说明更多内容.

奇怪的.以下代码:

#include <iostream>
#include <thread>

int main() {

    std::cout << "Started" << std::endl;

    std::thread::id nobody;

    if ( nobody != std::this_thread::get_id() )  {

      std::cout << "OK" << std::endl;
    }

    std::cout << "Finished" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

生产:

Started 
OK 
Finished
Run Code Online (Sandbox Code Playgroud)

点击这里.但是,您的代码确实因4.7.2而失败.

  • 要清楚,我不认为这与你引用的邮件有任何关系,它与尝试使用`std :: thread`而不是与'-pthread`链接有关. (2认同)
  • 现在这是http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57060 - 但要使用GCC的`std :: thread`获得正确的行为,你应该总是使用`-pthread` (2认同)

ind*_*ced 6

我没有访问C++ 11标准,但是从最新的标准草案n3485 [thread.thread.id]

thread :: id类型的对象为每个执行线程提供唯一标识符,并为不表示执行线程的所有线程对象提供单个不同的值(30.3.1)

其次是

id()noexcept; E ff ects:构造一个id类型的对象.后置条件:构造的对象不代表执行的线程.

这似乎意味着你所观察到的是gcc中的一个错误