【问题标题】:Implementation threads as library实现线程作为库
【发布时间】:2016-07-29 20:10:54
【问题描述】:

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

【问题讨论】:

  • C 语言中没有“本机”支持使用 pthread 进行线程化,本文将其用作线程库的示例,该线程库似乎可以工作,但存在以下问题:The Pthreads specification prohibits races, i.e. accesses to a shared variable while another thread is modifying it. The problem here is that whether or not a race exists depends on the semantics of the programming language, which in turn requires that we have a properly defined memory model. **Thus this definition is circular**. 所以线程库存在,并且在实践中有效,但它是 hack-ish。
  • 无法将线程高效且正确地实现作为库。 Boost::Thread 遭受了文章中概述的许多问题。同样相关:stackoverflow.com/questions/6319146/…
  • “Pthreads 规范禁止竞争,即在另一个线程修改共享变量时访问它。”。哇,那么它是如何工作的?毕竟,使用互斥锁是一种竞赛,不是吗?
  • 这实际上与当前 C++ 规范所说的非原子变量上的数据竞争是 UB 是一样的。两个线程竞相获取互斥锁很好,因为这发生在 pthreads 函数中。这篇论文确实解释了它的术语。
  • @PeterCordes,谢谢 :)

标签: c++ multithreading boost x86


【解决方案1】:

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

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

它并不完美,但我们现在比以前好多了。

我会推荐的信息:

  • Anthony Williams 的书:“C++ Concurrency In Action”
  • Herb Sutter 的“Atomic Weapons”会谈。

【讨论】:

  • 序列点在 C++11 中并不新鲜。根据您提供的链接,C++11 实际上将它们替换为之前/之后排序、不确定(如foo(i++, i++))或未排序(非原子数据竞争属于此类)的概念。但关键点是正确的:C++11 修改了其对排序的定义,使其在多线程 C++ 抽象机中有意义。
【解决方案2】:

Boost 线程充当底层操作系统(Win32 线程或 POSIX 线程)提供的本机线程的包装器。

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

不幸的是,他们定义的确切内容(以及定义方式)有所不同,这限制了 Boost 线程可以做的事情(尽管它们有相当多的宏来控制线程本地存储之类的工作方式,所以你仍然以半便携的方式访问许多设施)。

【讨论】:

    猜你喜欢
    • 2020-02-08
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多