C ++ 11认为什么是“线程”?

时间:2013-11-04 00:31:22

标签: c++ multithreading c++11 language-lawyer thread-local-storage

C ++ 11有一些线程概念。例如,它定义了一个新的存储说明符 thread_local ,并指定对于具有此存储说明符的变量,“每个线程有一个不同的对象或引用”[basic.stc.thread]

为此目的,什么被认为是“线索”?是仅使用标准线程库创建的线程(即由std::thread对象表示的线程)?通过其他方式创建的线程怎么样(例如,直接在Linux上使用pthreads)?如果我使用提供用户空间线程的库,那么每个人都会得到thread_local个对象的副本(我真的不知道如何实现)?

如果答案是“它的实现定义了什么被认为是thread_local等目的的线程”,那么有人可以举例说明一个众所周知的实现如何定义这个吗?

3 个答案:

答案 0 :(得分:3)

由于这些引号,只有线程支持库中的组件计数,或者标准状态在其自己的执行线程中运行的main

  

1以下子条款描述了创建和管理线程(1.10),执行互斥以及在线程之间传递条件和值的组件,如表148所示。

1.10的链接意味着所说的线程就是这些。

  

1执行线程(也称为线程)是程序中的单个控制流,包括初始...

因此,在我看来 threads 只引用stdlib线程(意思是std :: thread以及线程支持库在内部执行的任何操作)。当然thread_local在很多情况下最终可能会使用本机线程(特别是当您考虑在特定系统上通常没有多个选项来实现线程时)但是我可以告诉标准不保证。

答案 1 :(得分:3)

C ++11§1.10/ 1定义了术语:

  

执行线程(也称为线程)是程序中的单个控制流,包括特定顶级函数的初始调用,并递归地包括随后由线程执行的每个函数调用。 [注意:当一个线程创建另一个线程时,新线程的顶层函数的初始调用由新线程执行,而不是由创建线程执行。 - 结束记录]

斜体字表示这是确定的。你可以说这个定义在数学上是不足的,因为每个函数调用都定义了一个新的线程,但这显然是错误的。它们意味着最大单一控制流,否则非规范性注释将取消规范性“递归包含”文本的效果。

从核心语言的角度来看,std::thread导致这样的事情存在只是偶然的。

  

如果我使用提供用户空间线程的库,那么每个人都会得到thread_local个对象的副本(我真的不知道如何实现)?

没有内核调用就无法编写这样的库。很可能,进程中的所有线程都已经表示为高级抽象,例如pthread,只是为了满足内核。 C ++标准库可能是针对本机线程库编写的,只是“正常工作”而无需额外的粘合剂。

例如,thread_local对象在第一次访问时初始化,而不是在每个新线程启动时初始化,因此编译器只需插入基于pthread_self的查询来访问并初始化。初始化将使用pthread_cleanup工具注册析构函数。

这里实现定义的是预先存在的本机库是否与C ++兼容。假设他们提供了这个,并且它是客户倾向于想要的东西,那么在其上构建的所有其他线程库将自动兼容,除非发生其他冲突。

答案 2 :(得分:0)

该标准没有描述其他库和系统调用生成的线程如何表现。就标准而言,它们的行为是不确定的。在C ++中没有其他方法可以创建多个线程:这样的库或系统调用会执行C ++标准未标准化的事情。

现在,每个这样的库和系统调用都将以其自己的规范定义的方式运行。通常,C ++ std::thread甚至可以构建在这样的库或系统调用之上。未指定交互的工作原理。