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

时间:2013-04-17 15:57:18

标签: 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() );
};

这种行为是否正确?

2 个答案:

答案 0 :(得分:7)

更新: Jonathan Wakely善意地查看he says (below in comments)问题-pthread必须将 If either t1 or t2 are not valid thread IDs, the behavior is undefined. 传递给编译器和链接器。如果我这样做,代码也不会失败,使用gcc 4.7.2。所以答案显然与引用的电子邮件无关。谢谢乔纳森!


以下是gcc开发人员Jonathan Wakely's mail的一些引用,写于2011年:

  

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

     

[...]

     

2)operator ==使用pthread_equal,未定义为invalid   线程ID,POSIX说:

#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;
}
<德尔> 虽然它是两年前写的,但它可能仍然适用。 目前我无法检查gcc代码库来说明更多内容。

很奇怪。以下代码:

Started 
OK 
Finished

产生

{{1}}

检查here。但是,您的代码确实因4.7.2而失败。

答案 1 :(得分:6)

我无法访问C ++ 11标准,但是来自最新的标准草案n3485 [thread.thread.id]

  

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

接着是

  

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

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