我读过: “线程不能作为一个库实现”(http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf),我同意这篇文章的主要思想。但是,我怀疑:毕竟,在C++模型(C++ 11)之前,没有对线程的本地支持。但是,Boost能够提供一个线程库。那么,(如果)有可能/我误解了什么?作为库的实现线程
作为库的实现线程
回答
尽管信息仍然相关,但论文有点过时。从那以后,C++ 11引入了几个更新来解决这些问题。特别是,C++ 11为处理多线程程序添加了一个更明确定义的内存模型。正如本文所述,这与Java很相似。 C++ 11也巩固了sequence points的概念,现在称为“排序”,它添加了自己的线程库(基于boost),并添加了一个包含几个工具的原子库,用于处理无锁算法。
因此,C++委员会根据多线程环境中的行为改进了C++语言的规范。而且,他们已经明确定义了一组最小内存模型期望值。
它并不完美,但我们处在一个比我们更好的地方。
信息,我建议:
- 安东尼·威廉斯的书: “C++并发在行动”
- 香草萨特的 “Atomic Weapons” 会谈。
顺序点对于C++ 11来说并不新鲜。根据你给出的链接,C++ 11实际上用排序前/后,不确定(如'foo(i ++,i ++)')或非序列化(非原子数据竞争属于这个类别)的概念取代了它们。但关键点是正确的:C++ 11在多线程C++抽象机器中修改了其定序的定义。 –
@Peter Cordes根据您的更正进行编辑。 – ChrisG0x20
Boost线程充当底层OS(Win32线程或POSIX线程)提供的本机线程的包装。
这也取决于撰写编译器的人必须定义超出标准本身要求的行为才能使事情正常工作。
不幸的是,他们定义的内容(以及他们如何定义它)有所不同,这限制了Boost线程可以执行多少操作(尽管它们有相当数量的宏来控制线程本地存储的工作方式,所以您仍然可以通过半便携访问相当多的设施)。
- 1. 作为单例实现的线程
- 2. 如何实现线程库?
- 3. 线程实现
- 4. 实现线程
- 5. Python线程/线程实现
- 6. C++调整库以实现多线程
- 7. 如何从实现线程库开始?
- 8. Python的线程/线程池的实现
- 9. 线程池实现
- 10. 实现多线程
- 11. 线程池的实现
- 12. CppUnit的多线程实现?
- 13. 线程最好的实现
- 14. 为硒网格实现Java线程
- 15. 为窗口实现C11线程
- 16. java - 为线程实现接口
- 17. 使用XCode为iPhone实现多线程
- 18. 实现线程数组
- 19. 实现多线程环境
- 20. 使用C++实现线程
- 21. 如何使用多线程程序实现书库?
- 22. 为什么我的OpenMP实现比单线程实现更慢? (Followup)
- 23. 如何实现多线程的JFrame的
- 24. 从二叉树实现二叉树实现的线程
- 25. 在Oracle过程中实现多线程
- 26. 实现一个简单的线程池
- 27. .NET 2.0:File.AppendAllText(...) - 线程安全的实现
- 28. 线程间消息传递的实现
- 29. 如何实现多线程的jQuery
- 30. 实现'线程安全的'链表
对于使用pthreads的C中的线程没有“本地”支持,本文使用它作为似乎可行的线程库的示例,但存在如下问题:“Pthreads规范禁止比赛,即访问共享变量,而另一个线程正在修改它。这里的 的问题是,是否存在一个种族取决于编程语言的语义,而这又依赖于 要求我们有一个正确定义的内存模型。 **因此这个定义是循环**。所以线程库存在,并且在实践中工作,但它是黑客行为。 –
_Threads无法高效正确**作为Library_实现。 Boost :: Thread受到文章中概述的许多要点的困扰。还有相关:http://stackoverflow.com/questions/6319146/c11-introduced-a-standardized-memory-model-what-does-it-mean-and-how-is-it-g –
“Pthreads规范禁止比赛,即访问共享变量,而另一个线程正在修改它。“哇,那它是如何工作的?毕竟,采取互斥体是一种比赛,不是吗? – Gilgamesz