私はスレッドに少し慣れていないので、C++ 11 でスレッドがどのように機能するかを理解しようとしています。私のクラスの教授は、ミューテックスの使用方法を示すために次のサンプル コードを提供してくれました。
#include <list>
#include <mutex>
#include <algorithm>
std::list<int> some_list; // A data structure accessed by multiple threads
std::mutex some_mutex; // This lock will prevent concurrent access to the shared data structure
void
add_to_list(int new_value) {
std::lock_guard<std::mutex> guard(some_mutex); // Since I am going to access the shared data struct, acquire the lock
some_list.push_back(new_value); // Now it is safe to use some_list. RAII automatically releases lock at end of function }
}
bool
list_contains(int value_to_find) {
std::lock_guard<std::mutex> guard(some_mutex); // Must get lock every time I access some_list return
std::find (some_list.begin(),some_list.end(),value_to_find) != some_list.end();
}
コードはある程度自明だと思いますが、具体的な質問がいくつかありました。
- ミューテックスをリストに具体的に関連付ける必要はありませんか?
- そうでない場合、mutex が使用されるたびに、mutex が破棄されるまですべてのスレッドが停止するということですか? それとも、スレッドのサブセットにすぎませんか。おそらくいくつかのスレッドプール内のスレッドか、そうでなければ互いに関連付けられていますか?
- いずれにせよ、データ構造にアクセスしようとしているスレッドだけを停止する方がよいのではないでしょうか? それ以外の場合は、データ競合などについて心配する必要がないからです。
- 最後に、ミューテックスとロックの違いは何ですか? ミューテックスは単なる RAII ロックですか? それとも、ガード経由で RAII が発生していますか?