260*_*607 5 c++ multithreading boost boost-thread
我是多线程编程的新手,并且对Mutex如何工作感到困惑.在Boost :: Thread手册中,它指出:
互斥锁保证只有一个线程可以锁定给定的互斥锁.如果代码段被互斥锁定和解锁包围,则可以保证一次只有一个线程执行该段代码.当该线程解锁互斥锁时,其他线程可以进入该代码区域:
我的理解是,Mutex用于保护一段代码不被多个线程同时执行,不保护变量的内存地址.我很难掌握这个概念,如果我有2个不同的函数试图写入相同的内存地址会发生什么.
在Boost库中有这样的东西:
谢谢.
互斥锁本身仅确保在任何给定时间只有一个执行线程可以锁定互斥锁.您可以确保仅在互斥锁被锁定时才会修改关联变量.
C++确实为你提供了一种比C语言更容易实现的方法.在C语言中,正是由你来正确编写代码,确保在修改变量的任何地方,你首先锁定互斥锁(和,当然,在你完成后解锁它.
在C++中,将它全部封装到具有一些运算符重载的类中非常容易:
class protected_int {
int value; // this is the value we're going to share between threads
mutex m;
public:
operator int() { return value; } // we'll assume no lock needed to read
protected_int &operator=(int new_value) {
lock(m);
value = new_value;
unlock(m);
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
显然我正在简化这一点(到目前为止它可能毫无用处),但希望你能得到这个想法,即大多数代码只是将protected_int对象视为正常变量.
但是,当您这样做时,每次为其分配值时,互斥锁都会自动锁定,之后立即解锁.当然,这几乎是最简单的情况 - 在许多情况下,你需要做一些事情,比如锁定互斥锁,同时修改两个(或更多)变量,然后解锁.然而,无论复杂程度如何,您仍然希望将所有修改代码集中在一个地方,因此您不必担心在其余代码中锁定互斥锁.如果您有两个或多个变量,那么通常必须锁定互斥锁才能读取 - 而不仅仅是写入 - 否则您可以很容易地得到一个不正确的值,其中一个变量已被修改,但另一个变量已经被修改吨.