【发布时间】:2013-02-02 19:20:58
【问题描述】:
我对线程有些陌生,我正在尝试了解它在 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 是通过守卫发生的?
【问题讨论】:
-
这些都是很好的问题。质疑系统的详细工作原理是一种非常有用的态度,尤其是当您不熟悉特定技术时。
-
您的教授正在教您现代 C++?哇!
-
是的,教授实际上是标准委员会的成员:D
-
互斥锁是“门上的锁”。 lock_guard 是一个“锁定和解锁门上的锁”的对象。
标签: c++ multithreading mutex