2016-07-29 85 views
2

我读过: “线程不能作为一个库实现”(http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf),我同意这篇文章的主要思想。但是,我怀疑:毕竟,在C++模型(C++ 11)之前,没有对线程的本地支持。但是,Boost能够提供一个线程库。那么,(如果)有可能/我误解了什么?作为库的实现线程

+2

对于使用pthreads的C中的线程没有“本地”支持,本文使用它作为似乎可行的线程库的示例,但存在如下问题:“Pthreads规范禁止比赛,即访问共享变量,而另一个线程正在修改它。这里的 的问题是,是否存在一个种族取决于编程语言的语义,而这又依赖于 要求我们有一个正确定义的内存模型。 **因此这个定义是循环**。所以线程库存在,并且在实践中工作,但它是黑客行为。 –

+3

_Threads无法高效正确**作为Library_实现。 Boost :: Thread受到文章中概述的许多要点的困扰。还有相关:http://stackoverflow.com/questions/6319146/c11-introduced-a-standardized-memory-model-what-does-it-mean-and-how-is-it-g –

+0

“Pthreads规范禁止比赛,即访问共享变量,而另一个线程正在修改它。“哇,那它是如何工作的?毕竟,采取互斥体是一种比赛,不是吗? – Gilgamesz

回答

3

尽管信息仍然相关,但论文有点过时。从那以后,C++ 11引入了几个更新来解决这些问题。特别是,C++ 11为处理多线程程序添加了一个更明确定义的内存模型。正如本文所述,这与Java很相似。 C++ 11也巩固了sequence points的概念,现在称为“排序”,它添加了自己的线程库(基于boost),并添加了一个包含几个工具的原子库,用于处理无锁算法。

因此,C++委员会根据多线程环境中的行为改进了C++语言的规范。而且,他们已经明确定义了一组最小内存模型期望值。

它并不完美,但我们处在一个比我们更好的地方。

信息,我建议:

  • 安东尼·威廉斯的书: “C++并发在行动”
  • 香草萨特的 “Atomic Weapons” 会谈。
+1

顺序点对于C++ 11来说并不新鲜。根据你给出的链接,C++ 11实际上用排序前/后,不确定(如'foo(i ++,i ++)')或非序列化(非原子数据竞争属于这个类别)的概念取代了它们。但关键点是正确的:C++ 11在多线程C++抽象机器中修改了其定序的定义。 –

+0

@Peter Cordes根据您的更正进行编辑。 – ChrisG0x20

2

Boost线程充当底层OS(Win32线程或POSIX线程)提供的本机线程的包装。

这也取决于撰写编译器的人必须定义超出标准本身要求的行为才能使事情正常工作。

不幸的是,他们定义的内容(以及他们如何定义它)有所不同,这限制了Boost线程可以执行多少操作(尽管它们有相当数量的宏来控制线程本地存储的工作方式,所以您仍然可以通过半便携访问相当多的设施)。