並行プログラミングC ++? [閉まっている]
-
03-07-2019 - |
質問
私は、どこでも並行プログラミングについて耳にし続けています。 あなたはそれが何であるか、そしてC ++の新しい標準がどのように同じことを促進するかについていくつかの光を投げることができますか?
解決
並行性とは、コードが複数のことを同時に行うことです。これは通常、明示的な<!> quot; threads <!> quot;で行われますが、他の可能性もあります。たとえば、コードでOpenMPディレクティブを使用すると、OpenMPをサポートするコンパイラーが自動的にスレッドを生成します。
スレッドは、<!> quot; thread of execution <!> quot;の略です。シングルスレッドの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<>
クラステンプレートを使用した原子値と操作、 - データ保護のためのmutex(
std::mutex
、std::recursive_mutex
など) - ロックの有効期間の管理を容易にするためのロッククラス(
std::lock_guard<>
、std::unique_lock<>
) -
std::lock
およびstd::try_lock
関数は、デッドロックのリスクなしに同時に複数のロックの取得を管理します - イベントの待機を容易にする条件変数(
std::condition_variable
、std::condition_variable_any
) - スレッド間でのデータの受け渡しを簡素化し、値の準備が整うまで待機する、将来、約束、およびパッケージ化されたタスク。これは、古典的な<!> quot;スレッドから値を返す方法<!> quot;に対処します。質問。
- ローカル静的オブジェクトのスレッドセーフな初期化
- スレッドローカルデータを宣言する
thread_local
キーワード
devx.comの記事で、新しいC ++ 0xスレッドライブラリのより詳細な概要を説明しました: C ++ 0xのシンプルなマルチスレッド
私のブログで、C ++のマルチスレッドと並行性について書いています。トピックに関する本も書いています: C ++ Concurrency in Action 。
他のヒント
<!> quot; c ++の新しい標準が<!> quotをどのように促進するかと言うとき。コンカレントプログラミングでは、まもなく(?)リリースされるC ++ 09標準について話していると思います。
現在ドラフト形式になっている新しい標準は、並行プログラミングに役立つ以下の項目をサポートしています。
- 原子のタイプとアドレス
- スレッドクラス
- thread_localストレージ(数か月前にドラフト標準に追加されたばかり)
- 相互排除(mutexクラス)
- 条件変数-これはWindowsでは特に便利です。Win32では条件変数を正しく実装するのが難しいからです。これは、少なくともMSVC ++ランタイムでMicrosoftが条件変数のサポートを最終的に提供する必要があることを意味します。そのため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プリプロセッサディレクティブなど)。
ハードウェアの改善に伴い、垂直方向(より高速なシングルコア)ではなく水平方向(より多くのコア)に改善されます。つまり、アプリは<!> quot;潜在的な同時実行性<!> quot; <!> quot; faster <!> quot;でスケーリングするにはハードウェア。現在、言語はこれを最適にサポートするために進化しようとしており、将来の開発に最適な言語の位置にいます。
C ++ 0xは、<!> quot; old <!> quot;の組み込みサポートを追加しています。並行性をプログラミングする方法。さまざまなコンパイラベンダーが<!> quot; new <!> quot;を追加しています。スレッドモデルを抽象化し、スレッド数などの実行時決定を可能にするメソッド(マシンのハードウェアに基づいて)。特にMicrosoftについては、F#、同時実行ランタイム、並列拡張などを参照してください。
役立つこと。
これは、並行プログラミングを理解するのに最適な記事です。並行プログラミング
読むと、並行プログラミングとC ++の全体像がわかります。
簡単な要約として、並行プログラミングはマルチタスクを行うことであると言えます。プログラムがブロックされると、他のことができます。通常、ネットワーク接続を待機し、I / Oを処理しているときにブロックされます。 fork()
およびスレッドライブラリを使用して、並行プログラミングを促進できます。