c++ - 練習問題 - openmp




並行プログラミングC++? (6)

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

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

CSPは、スレッドとロック、および後から考えられるものの他のすべてのやり方とは対照的に、適切な並行パラダイムに基づいています。

(同時プログラミング言語(CSPにも基づく)についてはOccam-Piを参照)

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


あなたが「どのようにC ++の新しい標準がどのように並行プログラミングを容易にするか」と言うと、私はあなたがC ++ 09の標準規格であることを発表していると思います。

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

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

これは並行プログラミングを理解するための最善の記事です: 並行プログラミング

あなたはそれを読んだ後で、並行プログラミングとC ++の完全なイメージを得るでしょう。

簡単な要約として、並行プログラミングはマルチタスキングを行うことです。 プログラムがブロックされると、それは他のことをすることができます。 通常は、ネットワーク接続やI / Oの処理を待つ間にブロックされます。 fork()とスレッドライブラリを使用した並行プログラミングを容易にすることができます。


プログラミングパラダイムの将来の方向性に固有の、私のやや異なったテイク:

並行処理とは、ハードウェアがサポートしている場合は、一度に複数のことを実行できるようにプログラムを作成することです。 現在、ほとんどの言語は、プログラマがこれを指定できるようにするためにかなり重くて複雑なメカニズムを持っています(例えば、手動同期のスレッド、OpenMPプリプロセッサ指令など)。

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

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

希望が役立ちます。


並行処理とは、コードが複数のことを同時に行うことです。 これは通常、明示的な「スレッド」で行われますが、他にも可能性があります。 たとえば、コードでOpenMPディレクティブを使用すると、OpenMPをサポートするコンパイラによって自動的にスレッドが生成されます。

スレッドは「実行スレッド」の略です。 シングルスレッドのC ++プログラムでは、main()で実行が開始され、順次実行されます。 マルチスレッドプログラムでは、最初のスレッドはmainで始まりますが、ユーザー指定の関数で開始するアプリケーションによって追加のスレッドが開始される可能性があります。 これらは、同時に、または元のスレッドと並行して実行されます。

C ++では、スレッドはstd::threadクラスを使用して開始されstd::thread

void my_function()
{
    // do stuff
}
std::thread my_thread(my_function); // run my_function in its own thread

新しいC ++ 0x標準では、次の機能もサポートされています。

  • 原子値と操作をstd::atomic<>クラステンプレートを使用して、
  • データ保護のためのmutexes( std::mutexstd::recursive_mutexなど)
  • ロックの寿命を簡単に管理できるようにクラスをロックする( std::lock_guard<>std::unique_lock<>
  • std::lockstd::try_lockは同時にデッドロックを起こさずに複数のロックを取得する機能をstd::try_lockます
  • イベントの待機を容易にする条件変数( std::condition_variablestd::condition_variable_any
  • スレッド間でのデータの受け渡しを簡素化し、値の準備ができるまで待つことを約束します。 これは古典的な「スレッドから値を返す方法」の問題に対処します。
  • ローカル静的オブジェクトのスレッドセーフ初期化
  • スレッドローカルデータを宣言するthread_localキーワード

私はdevx.comに関する私の記事で新しいC ++ 0xスレッドライブラリの詳細を紹介しました: C ++での単純なマルチスレッド0x

私は私のブログでC ++のマルチスレッドと並行性について書いています。 私はトピックに関する本C ++ Concurrency in Actionも書いています。








c++11