并发编程c ++?

时间:2008-10-20 15:16:46

标签: c++ concurrency c++11

我一直听到有关并发编程的地方。 你们能否对它的内容以及c ++新标准如何促进这样做有所了解?

7 个答案:

答案 0 :(得分:72)

并发性是指您的代码同时执行多项操作。这通常使用显式“线程”完成,但还有其他可能性。例如,如果在代码中使用OpenMP指令,那么支持OpenMP的编译器将自动为您生成线程。

线程是“执行线程”的缩写。在单线程C ++程序中,执行从main()开始,然后以顺序方式进行。在多线程程序中,第一个线程从main开始,但是应用程序可以从用户指定的函数启动其他线程。然后它们同时运行,或与原始线程并行运行。

在C ++中,使用std::thread类启动0x线程:

void my_function()
{
    // do stuff
}
std::thread my_thread(my_function); // run my_function in its own thread

新的C ++ 0x标准也支持:

  • 使用std::atomic<>类模板的原子值和操作
  • 用于数据保护的互斥锁(std::mutexstd::recursive_mutex等)
  • 锁定类以便于管理锁定生命周期(std::lock_guard<>std::unique_lock<>
  • std::lockstd::try_lock功能可以同时管理获取多个锁,而不会有死锁风险
  • 条件变量,以便于等待事件(std::condition_variablestd::condition_variable_any
  • 期货,承诺和打包任务,以简化线程之间的数据传递,并等待值准备就绪。这解决了经典的“如何从线程返回值”的问题。
  • 本地静态对象的线程安全初始化
  • 用于声明线程本地数据的thread_local关键字

我在devx.com上的文章中详细介绍了新的C ++ 0x线程库:Simpler Multithreading in C++0x

我在my blog上用C ++写了关于多线程和并发的文章。我还写了一本关于这个主题的书:C++ Concurrency in Action

答案 1 :(得分:17)

当你说“c ++新标准如何促进”并发编程时,我假设你在谈论即将发布的(?)C ++ 09标准。

目前以草稿形式出现的新标准支持以下有助于并发编程的项目:

  • 原子类型和地址
  • 线程类
  • thread_local存储(几个月前刚刚添加到草案标准中)
  • 互斥(互斥类)
  • 条件变量 - 这对Windows来说特别好,因为条件变量很难在Win32中正确实现。这意味着Microsoft最终应该至少在MSVC ++运行时提供对条件变量的支持,因此很容易在WIn32上获得正确的条件变量语义。

答案 2 :(得分:5)

答案 3 :(得分:5)

并发性为给定进程提供了多个执行线程。截至今天,C ++并不直接支持它。但是,存在几个将给定函数绑定到新执行线程的库。 Unix标准是pthreads库。

答案 4 :(得分:5)

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

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

CSP是基于适当的并发范例,而不是线程和锁以及所有其他方式,这些都是事后的想法。

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

答案 5 :(得分:3)

我的观点略有不同,具体针对编程范式的未来方向:

并发性是指编写程序,以便在硬件支持时可以同时执行多项操作。目前,大多数语言都有相当繁重和复杂的机制,允许程序员指定它(例如:具有手动同步的线程,OpenMP预处理器指令等)。

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

C ++ 0x正在为“旧”编程并发方法添加更多内置支持。各种编译器供应商正在添加“新”方法,这些方法抽象了线程模型并允许对线程数等进行运行时决策(基于机器的硬件);特别是对于Microsoft,请参阅F#,并发运行时,并行扩展等。

希望有所帮助。

答案 6 :(得分:1)

这是理解并发编程的最佳文章:Concurrent Programming

阅读后,您将全面了解并发编程和C ++。

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