47

我不断听到有关并发编程的消息。你们能否阐明它是什么以及 c++ 新标准如何促进做同样的事情?

4

7 回答 7

74

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

线程是“执行线程”的缩写。在单线程 C++ 程序中,执行从 main() 开始,然后按顺序进行。在多线程程序中,第一个线程从 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 标准还支持:

  • std::atomic<>类模板的原子值和操作,
  • 用于数据保护的互斥锁(std::mutex,std::recursive_mutex等)
  • 用于轻松管理锁生命周期的锁类 ( std::lock_guard<>, std::unique_lock<>)
  • std::lock以及std::try_lock管理同时获取多个锁而不会出现死锁风险的功能
  • 用于缓解等待事件的条件变量 ( std::condition_variable, std::condition_variable_any)
  • futures、promise 和打包任务来简化线程之间的数据传递,并等待一个值准备好。这解决了经典的“我如何从线程返回值”问题。
  • 本地静态对象的线程安全初始化
  • thread_local声明线程本地数据的关键字

我在 devx.com 上的文章中对新的 C++0x 线程库进行了更详细的概述:C++0x 中的更简单的多线程

我在我的博客上写了关于 C++ 中的多线程和并发的文章。我也在写一本关于这个主题的书:C++ Concurrency in Action

于 2008-10-20T15:27:16.127 回答
17

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

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

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

也许这个视频可能会为你带来一些启发:-)
http://channel9.msdn.com/posts/Charles/The-Concurrency-Runtime-Fine-Grained-Parallelism-for-C/

于 2008-10-20T15:18:28.827 回答
5

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

于 2008-10-20T15:19:43.880 回答
5

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

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

CSP 基于适当的并发范例,而不是线程和锁以及所有其他事后才添加的东西。

(有关并发编程语言(也基于 CSP),请参阅 Occam-Pi)

于 2008-10-20T16:21:30.150 回答
3

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

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

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

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

希望有帮助。

于 2008-10-20T16:15:48.260 回答
1

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

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

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

于 2013-07-19T02:59:33.160 回答