web-dev-qa-db-ja.com

並行プログラミングC ++?

私はどこでも並行プログラミングについて聞いています。あなたはそれが何であるか、そしてC++の新しい標準が同じことをどのように促進するかについていくつかの光を投げることができますか?

46
yesraaj

並行性とは、コードが同時に複数のことを実行することです。これは通常、明示的な「スレッド」で行われますが、他の可能性もあります。たとえば、コードで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::mutexstd::recursive_mutexなど)
  • ロックの有効期間の管理を容易にするロッククラス(std::lock_guard<>std::unique_lock<>
  • std::lockおよびstd::try_lock関数は、デッドロックの危険を冒すことなく、同時に複数のロックの取得を管理します
  • イベントの待機を容易にする条件変数(std::condition_variablestd::condition_variable_any
  • スレッド間でのデータの受け渡しを簡素化し、値の準備が整うまで待機する先物、約束、およびパッケージ化されたタスク。これは、古典的な「スレッドから値を返す方法」の質問に対処します。
  • ローカルの静的オブジェクトのスレッドセーフな初期化
  • スレッドローカルデータを宣言するthread_localキーワード

Devx.comの記事で、新しいC++ 0xスレッドライブラリのより詳細な概要を説明しました。 C++ 0xのシンプルなマルチスレッド

my blog でC++のマルチスレッドと並行性について書いています。また、このトピックに関する本を書いています: C++ Concurrency in Action

73

「c ++の新しい標準がコンカレントプログラミングをどのように促進するか」と言うとき、すぐに(?)リリースされるC++ 09標準について話していると思います。

現在、ドラフト形式にある新しい標準は、並行プログラミングに役立つ以下の項目をサポートしています。

  • アトミックタイプとアドレス
  • スレッドクラス
  • thread_localストレージ(数か月前にドラフト標準に追加されたばかり)
  • 相互排除(相互排他クラス)
  • 条件変数-条件変数はWin32で正しく実装するのが難しいため、これはWindowsで特に便利です。これは、最終的にMicrosoftが少なくともMSVC++ランタイムで条件変数のサポートを提供する必要があることを意味するため、WINn32で正しい条件変数のセマンティクスを簡単に取得できます。
17
Michael Burr

C++ CSP2-C++の簡単な同時実行

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

CSPは、スレッドとロック、および後付けとして追加されるその他すべての方法とは対照的に、適切な並行パラダイムに基づいています。

(並行プログラミング言語については、Occam-Piを参照してください(CSPにも基づいています))

5
Dynite

おそらく、このビデオはあなたのためにいくつかの光を照らすのに役立つかもしれません:-)
http://channel9.msdn.com/posts/Charles/The-Concurrency-Runtime-Fine-Grained-Parallelism-for-C/

5
Joel Martinez

同時実行性は、特定のプロセスに対して複数の実行スレッドを持っています。現在、C++は直接サポートしていません。ただし、特定の関数を新しい実行スレッドに結び付けるライブラリがいくつか存在します。 Unix標準はpthreadsライブラリです。

5
Paul Nathan

プログラミングパラダイムの将来の方向性に特有の、私のわずかに異なる見解:

並行性とは、ハードウェアがサポートしている場合に一度に複数のことを実行できるようにプログラムを記述することです。現在、ほとんどの言語には、プログラマーがこれを指定できるようにするかなり重くて複雑なメカニズムがあります(例:手動同期のスレッド、OpenMPプリプロセッサーディレクティブなど)。

ハードウェアが改善されると、垂直方向(より高速なシングルコア)ではなく水平方向(より多くのコア)に改善されます。これは、「より高速な」ハードウェアで拡張するために、アプリが「潜在的な同時実行性」を持つ必要があることを意味します。言語は現在、これを最適にサポートするために進化しようとしており、将来の開発に最適な言語の地位にあります。

C++ 0xは、プログラミングの並行性の「古い」方法に対する組み込みサポートを追加しています。さまざまなコンパイラベンダーが、スレッドモデルを抽象化し、スレッド数などの実行時決定を可能にする「新しい」メソッドを追加しています(マシンのハードウェアに基づいて)。特にMicrosoftについては、F#、同時実行ランタイム、並列拡張などを参照してください。

お役に立てば幸いです。

3
Nick

これは、並行プログラミングを理解するのに最適な記事です。 並行プログラミング

読むと、並行プログラミングとC++の全体像を把握できます。

簡単な要約として、並行プログラミングはマルチタスクを行うことであると言えます。プログラムがブロックされると、他のことができます。通常、ネットワーク接続を待機し、I/Oを処理しているときにブロックされます。 fork()およびスレッドライブラリを使用して、並行プログラミングを促進できます。

1
Marcus Thornton