std::thread::id 默认构造函数不应该创建一个"NULL" id吗?
Should not std::thread::id default constructor create a "NULL" id?
以下代码在我的gcc 4.8.0版本中失败:
#include <thread>
#include <cassert>
int main() {
std::thread::id nobody;
assert( nobody != std::this_thread::get_id() );
};
这个行为正确吗?
UPDATE: Jonathan Wakely亲切地看着这个问题,他说(在下面的评论中)-pthread
必须传递给编译器和链接器。如果我这样做,代码也不会与gcc 4.7.2失败。因此,答案显然与引用的电子邮件无关。谢谢乔纳森!
std::thread::id上的所有比较操作符都依赖于undefined行为,因为我们的thread::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
相关文章:
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- SQLite3 C++检索 ID 并存储到另一个表
- 与上一个线程具有相同ID的线程同步
- C QT中的SQL数据库更新未前进到下一个ID
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 我想使用C++映射,以存储一个矩形id的4个坐标,任何人都可以举一个例子吗
- 通过传递一个ID(c++)从数据库中检索数据
- 如何在另一个表中使用表的上次插入id
- 获取C++中另一个进程的会话 ID
- 如何获取插入菜单项时要使用的下一个命令 ID
- 如何使用信号和插槽从qt表单中获取id,然后在链表中搜索它并使用另一个表单显示结果
- 将组合框设置为另一个组合框的ID
- 仅使用一个用户id和密码访问数据库
- 是否可以生成一个不可破坏的硬件ID或一个很难伪造的硬件ID?(即购买新的电脑部件?)
- 遇到错误问题:在'{'之前,预期的非限定 id 只是一个我需要的类的标头,只是不确定导致错误的原因
- 一个IP地址和一个端口号可以一起唯一地标识一个进程ID吗
- 给定一个线程 ID,如何确定它在 Linux 上C++中是否处于活动状态
- 非类-name c++ 11类型-name是一个simple-template-id
- 如何获得所有进程id相关(他们都是一个程序的进程)
- std::thread::id 默认构造函数不应该创建一个"NULL" id吗?