并发编程的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::mutexstd::recursive_mutex等)
  • 锁类以方便pipe理锁的生命周期( std::lock_guard<>std::unique_lock<>
  • std::lockstd::try_lock函数pipe理同时获取多个锁,而不会冒死锁的风险
  • 条件variables缓解等待事件( std::condition_variablestd::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语义。

并发性对于一个给定的进程有多个执行线程。 截至今天,C ++并不直接支持它。 然而,有几个库将把一个给定的函数绑定到一个新的执行线程上。 Unix标准是pthreads库。

C ++ CSP2 – C ++的简单并发

http://www.cs.kent.ac.uk/projects/ofa/c++csp/

CSP是基于一个适当的并行范式,而不是线程和锁,以及所有其他方式的事情,作为事后的追求。

(参见Occam-Pi的并发编程语言(也基于CSP))

文章:检查这些文章了解并发

  1. 免费的午餐结束了
  2. 由herbsutter选定的文章
  3. 链接到PDF

我略有不同的看法,具体到编程范式的未来方向:

并发就是编写你的程序,这样,如果硬件支持它,它可以同时做多个事情。 目前,大多数语言都有相当繁重和复杂的机制来允许程序员指定(例如:手动同步的线程,OpenMP预处理器指令等)。

随着硬件的改进,它将水平(更多内核)而不是垂直(更快的单核)提高。 这意味着应用程序需要具有“潜在的并发性”才能使用“更快”的硬件进行扩展。 语言目前正在努力发展,以最好地支持这一点,成为未来发展的最佳语言。

C ++ 0x为编程并发性的“旧”方法增加了更多的内置支持。 各种编译器厂商都在增加“新”的方法来抽象线程模型,并允许运行时决定线程的数量等(基于机器的硬件)。 特别是微软,请参阅F#,并行运行时,并行扩展等。

希望有所帮助。

这是了解并发编程的最好的文章: 并发编程

读完之后,你将会看到并发编程和C ++的全貌。

作为一个简单的总结,我们可以说并发编程就是做多任务处理。 当程序被阻塞时,它可以做其他事情。 通常我们在等待networking连接和处理I / O时被阻塞。 我们可以使用fork()和线程库来促进并发编程。