不应该std :: thread :: id默认构造函数创build一个“NULL”ID?

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

#include <thread> #include <cassert> int main() { std::thread::id nobody; assert( nobody != std::this_thread::get_id() ); }; 

这种行为是正确的吗?

更新: Jonathan Wakely善意地看着他说的问题(下面的注释) ,- -pthread必须传递给编译器和链接器。 如果我这样做,代码也不会因为gcc 4.7.2而失败。 所以答案显然与引用的电子邮件无关。 谢谢乔纳森!


下面是一些直接来自gcc开发人员Jonathan Wakely的邮件 ,2011年写的:

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

[…]

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

  If either t1 or t2 are not valid thread IDs, the behavior is undefined. 

虽然它是两年前写的,但可能还是适用的。 目前,我无法检查海湾合作委员会的代码说更多。


奇怪的。 以下代码:

 #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; } 

生产:

 Started OK Finished 

在这里检查。 但是,您的代码在4.7.2中失败。

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

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

其次是

id()noexcept; 效果:构造一个id类型的对象。 后置条件:构造的对象不代表执行的线程。

这似乎意味着你正在观察的是gcc中的一个bug