0

pthread API の勉強を始めたばかりです。私はさまざまな本や Web サイトを使用してきましたが、それらすべてのレポートから判断すると、pthread 同期関数 (mutex を含む関数など) はすべて、ユニプロセッサ環境とマルチプロセッサ環境の両方で機能します。しかし、これらの情報源のどれもそれを明示的に述べていないので、それが実際に当てはまるかどうかを知りたかったのです (もちろん、そう信じています。100% 確信したかっただけです)。

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

4

1 に答える 1

1

はい、そうです。POSIX API は、実装の要件の観点から説明されています。たとえば、apthread_mutex_lock()はゼロを返すかEOWNERDEAD、呼び出し元のスレッドによってロックおよび所有されているミューテックスで返される必要があります。マルチプロセッサ環境にも例外はありません。そのため、マルチプロセッサ環境での適合する実装は、それを機能させ続ける必要があります。

では、異なる CPU で実行されている 2 つのスレッド pthread_mutex_lock()が同時に同じミューテックスでロック (例: ) を呼び出した場合、このルーチンの実行は並列ではなく順次実行されるのでしょうか?

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

そして、最初のロックが終了し、それを呼び出したスレッドがクリティカル セクションへのプライベート アクセスを取得した後、別の CPU 上の別のスレッドによって実行されたロックにより、後者のスレッドが中断されますか?

はい - の仕様にpthread_mutex_lock()は次のように書かれています:

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

于 2016-10-30T23:28:30.353 に答える