我不断听到有关并发编程的消息。你们能否阐明它是什么以及 c++ 新标准如何促进做同样的事情?
7 回答
并发是关于您的代码同时执行多项操作。这通常通过显式“线程”完成,但还有其他可能性。例如,如果您在代码中使用 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。
当您说“c++ 新标准如何促进”并发编程时,我假设您正在谈论即将发布的(?)C++09 标准。
目前处于草案形式的新标准支持以下有助于并发编程的项目:
- 原子类型和地址
- 一个线程类
- thread_local 存储(几个月前刚刚添加到标准草案中)
- 互斥(互斥类)
- 条件变量——这对 Windows 来说特别好,因为条件变量很难在 Win32 中正确实现。这意味着最终微软至少应该在 MSVC++ 运行时提供对条件变量的支持,这样在 WIn32 上就很容易获得正确的条件变量语义。
也许这个视频可能会为你带来一些启发:-)
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 基于适当的并发范例,而不是线程和锁以及所有其他事后才添加的东西。
(有关并发编程语言(也基于 CSP),请参阅 Occam-Pi)
我的看法略有不同,具体到编程范式的未来方向:
并发性是关于编写程序,以便在硬件支持的情况下它可以一次执行多项操作。目前,大多数语言都有相当繁重和复杂的机制来允许程序员指定这一点(例如:具有手动同步的线程、OpenMP 预处理器指令等)。
随着硬件的改进,它将水平改进(更多内核)而不是垂直改进(更快的单核)。这意味着应用程序需要具有“潜在并发性”才能使用“更快”的硬件进行扩展。语言目前正在努力发展以最好地支持这一点,以成为未来发展的最佳语言。
C++0x 正在为“旧”的并发编程方法添加更多内置支持。各种编译器供应商正在添加“新”方法,这些方法抽象线程模型并允许在运行时决定线程数量等(基于机器的硬件);特别是对于 Microsoft,请参阅 F#、并发运行时、并行扩展等。
希望有帮助。
这是了解并发编程的最佳文章:并发编程
读完之后,您将全面了解并发编程和 C++。
作为一个快速的总结,我们可以说并发编程就是做多任务处理。当一个程序被阻塞时,它可以做其他事情。通常我们在等待网络连接和处理 I/O 时会被阻塞。我们可以使用fork()
线程库来促进并发编程。