并发编程的C + +?
我一直听说每个地方的并发编程。 你们可以点亮一下它是什么,以及c ++新标准如何促进这样做?
并发是关于你的代码在同一时间做多件事情。 这通常是用明确的“线程”来完成的,但还有其他的可能性。 例如,如果在代码中使用OpenMP指令,则支持OpenMP的编译器将自动为您生成线程。
线程是“执行线程”的简称。 在一个单线程的C ++程序中,执行从main()开始,然后以顺序的方式继续。 在一个multithreading程序中,第一个线程从main开始,但是可以由应用程序启动额外的线程,这些线程从用户指定的函数开始。 这些然后同时运行,或与原始线程并行运行。
在C ++中,0x线程使用std::thread
类来启动:
void my_function() { // do stuff } std::thread my_thread(my_function); // run my_function in its own thread
新的C ++ 0x标准还支持:
- primefaces值和操作与
std::atomic<>
类模板, - 数据保护互斥(
std::mutex
,std::recursive_mutex
等) - 锁类以方便pipe理锁的生命周期(
std::lock_guard<>
,std::unique_lock<>
) -
std::lock
和std::try_lock
函数pipe理同时获取多个锁,而不会冒死锁的风险 - 条件variables缓解等待事件(
std::condition_variable
,std::condition_variable_any
) - 期货,承诺和打包的任务,以简化在线程之间传递数据,并等待值准备就绪。 这解决了经典的“我如何从线程返回值”的问题。
- 本地静态对象的线程安全初始化
-
thread_local
关键字来声明线程本地数据
我在devx.com文章中给出了关于新的C ++ 0x线程库的更详细的概述: 在C ++ 0x中更简单的multithreading
我在我的博客上写了关于C ++的multithreading和并发性。 我还正在编写一本关于以下主题的书: C ++ Concurrency in Action 。
当你说“c ++新标准如何促进”并发编程时,我假设你正在讨论即将发布的C ++ 09标准。
目前以草案forms提出的新标准支持以下有助于并发编程的项目:
- primefacestypes和地址
- 一个线程类
- thread_local存储(几个月前刚添加到标准草案中)
- 互斥(互斥类)
- 条件variables – 这对于Windows来说特别好,因为条件variables很难在Win32中正确实现。 这意味着最终Microsoft应该至less在MSVC ++运行时提供对条件variables的支持,所以在WIn32上很容易获得正确的条件variables语义。
也许这个video可能会帮助你发光一些:-)
http://channel9.msdn.com/posts/Charles/The-Concurrency-Runtime-Fine-Grained-Parallelism-for-C/
并发性对于一个给定的进程有多个执行线程。 截至今天,C ++并不直接支持它。 然而,有几个库将把一个给定的函数绑定到一个新的执行线程上。 Unix标准是pthreads库。
C ++ CSP2 – C ++的简单并发
http://www.cs.kent.ac.uk/projects/ofa/c++csp/
CSP是基于一个适当的并行范式,而不是线程和锁,以及所有其他方式的事情,作为事后的追求。
(参见Occam-Pi的并发编程语言(也基于CSP))
文章:检查这些文章了解并发
- 免费的午餐结束了
- 由herbsutter选定的文章
- 链接到PDF
我略有不同的看法,具体到编程范式的未来方向:
并发就是编写你的程序,这样,如果硬件支持它,它可以同时做多个事情。 目前,大多数语言都有相当繁重和复杂的机制来允许程序员指定(例如:手动同步的线程,OpenMP预处理器指令等)。
随着硬件的改进,它将水平(更多内核)而不是垂直(更快的单核)提高。 这意味着应用程序需要具有“潜在的并发性”才能使用“更快”的硬件进行扩展。 语言目前正在努力发展,以最好地支持这一点,成为未来发展的最佳语言。
C ++ 0x为编程并发性的“旧”方法增加了更多的内置支持。 各种编译器厂商都在增加“新”的方法来抽象线程模型,并允许运行时决定线程的数量等(基于机器的硬件)。 特别是微软,请参阅F#,并行运行时,并行扩展等。
希望有所帮助。
这是了解并发编程的最好的文章: 并发编程
读完之后,你将会看到并发编程和C ++的全貌。
作为一个简单的总结,我们可以说并发编程就是做多任务处理。 当程序被阻塞时,它可以做其他事情。 通常我们在等待networking连接和处理I / O时被阻塞。 我们可以使用fork()
和线程库来促进并发编程。