我对线程有点陌生,我试图了解它在 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();
}
我认为代码有点不言自明,但我有一些具体问题。
- 是否不需要专门将互斥锁与列表相关联?
- 如果不是,这是否意味着任何时候使用互斥锁,所有线程都会停止,直到互斥锁被销毁?或者它只是线程的一个子集;也许某个线程池中的线程或以其他方式相互关联?
- 无论是哪种情况,只停止试图访问数据结构的线程不是更好吗?因为否则,我们不担心数据竞争等。
- 最后,互斥锁和锁有什么区别?互斥锁只是一个 RAII 锁吗?或者 RAII 是通过守卫发生的?