2016-10-30 30 views
0

私はpthread APIを勉強し始めました。私はさまざまな書籍やウェブサイトを使用してきましたが、それらがすべて報告されていると判断して、pthread同期関数(mutexを含む関数など)はすべてユニプロセッサとマルチプロセッサ環境の両方で動作します。しかし、これらの情報源のどれも明示的に言及していないので、実際にそうであるかどうかを知りたがっています(当然、私は100%確信したかったと思います)。pthread APIはマルチプロセッサ環境で同期を提供しますか?

異なるCPU上で実行されている2つのスレッドが同時に同じmutex上にロック(たとえばpthread_mutex_lock())と呼ばれる場合、このルーチンの実行は並列ではなく順次実行されますか?最初のロックが終了し、それを呼び出すスレッドがクリティカルセクションへのプライベートアクセスを持つと、別のCPU上の他のスレッドによって実行されるロックは、後のスレッドを中断させますか?

+3

あなたの質問に対する回答が否定的だった場合の結果を1秒間だけ想像してください。 –

+0

はい。もしそうでなければそれほど役に立たないでしょう。 –

答えて

1

はい、あります。 POSIX APIは実装上の要件として記述されています。たとえば、pthread_mutex_lock()が0を返します。EOWNERDEADは、呼び出しスレッドによってロックされ、所有されているmutexと共に返されなければなりません。マルチプロセッサ環境には例外がないため、マルチプロセッサ環境での適合した実装は引き続き動作させる必要があります。

異なるCPU上で実行されている2つのスレッドが同時に同じミューテックスのロック(例えば pthread_mutex_lock())と呼ばれるのであれば、本ルーチンの実行を むしろ平行よりも順次実行されるでしょうか?

pthread_mutex_lock()の下にど​​のように機能するかを指定しますが、アプリケーションの観点から、あなたはそれがエラーを返さない場合は、あなたのスレッドがロックを取得したことを知っていません。

そして、最初のロック後に終わり、それを呼び出すスレッドがクリティカルセクションへ プライベートのアクセス権を持つ、別のCPUに 他のスレッドで実行されるロックが一時停止する後者のスレッドを引き起こすのでしょうか?

はい - pthread_mutex_lock()のための仕様は言う:

mutexがすでに別のスレッドによってロックされている場合、ミューテックスが使用可能になるまで、呼び出したスレッド をブロックするものとします。

関連する問題