私はどこでも並行プログラミングについて耳にします。それが何であるか、そしてC++の新しい標準が同じことをどのように容易にするかについて、いくつかの光を当てることができますか?
7 に答える
並行性とは、コードが同時に複数のことを実行することです。これは通常、明示的な「スレッド」を使用して行われますが、他の可能性もあります。たとえば、コードでOpenMPディレクティブを使用する場合、OpenMPをサポートするコンパイラーが自動的にスレッドを生成します。
スレッドは「実行スレッド」の略です。シングルスレッドのC++プログラムでは、実行は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 ++ ConcurrencyinAction。
「C++ の新しい標準が並行プログラミングをどのように促進するか」とあなたが言うとき、私はあなたがまもなく (?) リリースされる C++09 標準について話していると思います。
現在ドラフト形式の新しい標準では、並行プログラミングに役立つ次の項目がサポートされています。
- 原子タイプとアドレス
- スレッドクラス
- thread_local ストレージ (数か月前にドラフト標準に追加されたばかり)
- 相互排除 (mutex クラス)
- 条件変数 - Win32 では条件変数を正しく実装するのが難しいため、これは特に Windows に適しています。これは、最終的に Microsoft が少なくとも 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 は、スレッドやロック、および後付けとして追加された他のすべての方法とは対照的に、適切な並行パラダイムに基づいています。
(並行プログラミング言語については Occam-Pi を参照してください (これも CSP に基づいています))
プログラミングパラダイムの将来の方向性に固有の、私の少し異なる見方:
並行性とは、ハードウェアがサポートしている場合に一度に複数のことを実行できるようにプログラムを作成することです。現在、ほとんどの言語には、プログラマがこれを指定できるようにするためのかなり重くて複雑なメカニズムがあります (例: 手動同期を伴うスレッド、OpenMP プリプロセッサ ディレクティブなど)。
ハードウェアが向上するにつれて、垂直方向 (単一コアの高速化) ではなく、水平方向 (コア数の増加) で向上します。これは、「より高速な」ハードウェアでスケーリングするために、アプリに「潜在的な同時実行性」が必要になることを意味します。言語は現在、これを最大限にサポートし、将来の開発に最適な言語の位置に立つように進化しようとしています。
C++0x では、並行プログラミングの「古い」メソッドの組み込みサポートが追加されています。さまざまなコンパイラ ベンダーが、スレッド モデルを抽象化し、(マシンのハードウェアに基づいて) スレッド数などを実行時に決定できるようにする「新しい」メソッドを追加しています。特に Microsoft については、F#、同時実行ランタイム、並列拡張機能などを参照してください。
それが役立つことを願っています。
これは、並行プログラミングを理解するための最良の記事です:並行プログラミング
これを読めば、並行プログラミングと C++ の全体像をつかむことができます。
簡単にまとめると、並行プログラミングとはマルチタスクを行うことだと言えます。プログラムがブロックされると、他のことができるようになります。通常、ネットワーク接続の待機中および I/O の処理中にブロックされます。fork()
スレッドライブラリを使用して並行プログラミングを容易にすることができます。