4

Linux は私にとって新しいプラットフォームです。私は何年もの間、Windows で c++ を使用してコーディングしており、そのプラットフォームでのマルチスレッドに慣れてきました。

Linux プラットフォームで C++ を学ぶ必要がある時期に、C++11 が登場しました。

Linux はほとんどの部分で pthreads を使用しているようです。boost::threads もあり、QT にも独自のスレッドがあります。しかし、C++11 には、スレッドを実行するためのまったく新しい (クロス プラットフォームおよび C++ 標準) 方法である std::thread が付属しています。

だから私は pthreads と std::threads を学ばなければならないと思います。最終的には、std::thread の方が重要に思えますが、そこには多くのレガシー コードがあるため、両方を知る必要があります。

Windows でのスレッド同期の場合、WaitForMultipleObjectsを使用して、いくつかのタスクが完了するのを待ってから、さらに作業を続けます。

pthread にも同様の同期メカニズムはありますか? std::スレッド?

私はpthread_joinを見てきましたが、一度に 1 つのスレッドだけを待機する機能があるようです。別の pthread 呼び出しが欠落している可能性がありますか?

4

5 に答える 5

8

std::threadいくつかのエクストラで C++11 に受け入れboost::threadられます。私の理解ではboost::thread、コードで置き換えられた場合std::threadでも、コンパイルして動作するはずです。

boost::thread設計に基づいておりpthreads、スレッド、ミューテックス、および条件変数に薄い C++ ラッパーを提供します。ただし、スレッドのキャンセルは、C++ でどのように動作するかについて合意がなかったため、C++11 の範囲外に残されました。

したがって、学習することで、概念pthreadsも学習します。C APIの上に主にシンタックス シュガーと便利な関数を追加します。std::threadstd::threadpthreads

に関してはWaitForMultipleObjects()、そのモードに似たものを提供することpthreadsも提供することもありませんが、パイプを使用して UNIX で、またはより最新のLinuxで定期的にシミュレートされます。いずれにせよすべてのオブジェクトの準備が整うまで進行しないため、モードはすべてのタスクを順番に待機することでシミュレートできます。std::threadbWaitAll=FALSEselect()eventfd()epoll()bWaitAll=TRUE

于 2012-05-30T14:36:25.273 に答える
1

いいえ、pthreads も C++11 も直接同等のものはありませんWaitForMultipleObjects(つまり、待機可能な「ハンドル」タイプを待機します)。 pthread_joinスレッドを結合するためにのみ使用でき、単一の特定のスレッドのみを使用できます。

posix プラットフォームで最も近い方法はselect()poll()や Linux 固有のなどのシステム コールを使用して複数のファイル記述子を待機epoll()することですが、待機するファイル記述子が必要です。これは I/O イベントでは問題ありませんが、追加の作業が必要です。ミューテックス、条件変数、またはその他の同期オブジェクトを待つ必要があります。libeventlibevBoost ASIOなど、これらのシステム コールの上に構築された、より一般的なイベント ライブラリがあります。これらは、I/O と同様にタイマーの待機をサポートしますが、スレッドの完了、ミューテックス ロックなどはサポートしません。WaitForMultipleObjects

pthread と C++11 スレッドの代替手段は、異なる同期タイプを個別に待機することです。タイマーを待つ、スレッドが完了するのを待つ、mutex を待つ、条件変数を待つ、非同期の結果が準備できるのを待つ ( std::asyncC++11 では、pthreads に直接相当するものはありません) ... しかし、それを行う呼び出しはありませんこれらのタイプの異種セットを一度に待機できます。

于 2012-05-30T14:43:44.200 に答える
0

私はあなたに本当に素晴らしい答えを与えることができますが、残念ながら、これは私がそれらを学んだ場所であり、それは良い紹介です:

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

pthread_mutex_t同期に使用し、pthread_joinおそらく複数のタスクの待機の問題を処理します。期待どおりに機能します。

于 2012-05-30T14:34:31.677 に答える
0

についてWaitForMultipleObjectsは、一般的にバリアシンクと呼んでいます。Boost にはバリアと呼ばれる実装があります。条件変数を使用して実装します。posix ではpthread_cond_t

これは、バリア同期を説明するために私が最近残した回答です。

于 2012-05-30T14:35:16.357 に答える
0

これに基づいて、pthread_join作成した単一のスレッドごとに呼び出す必要があります。または、スレッドを同期する必要がある場合は、ミューテックスを使用します。

于 2012-05-30T14:38:08.457 に答える