7

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

#include <thread>
#include <cassert>

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

    assert( nobody != std::this_thread::get_id() );
};

这种行为正确吗?

4

2 回答 2

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.
虽然它是两年前写的,但它可能仍然适用。目前我无法检查 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;
}

产生:

Started 
OK 
Finished

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

于 2013-04-17T16:25:22.353 回答
6

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

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

其次是

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

这似乎暗示您所观察到的是 gcc 中的一个错误

于 2013-04-17T16:15:32.327 回答