[英]Global data behaviour in Multi-thread environment, C++
我有一个运行三个线程的应用程序。 这三个线程都基于全局变量的状态进行一些操作。 其中两个线程正在运行同一段代码,而一个线程正在运行另一段代码。
例如:
全局变量的初始值为false
gGlobalVarLock = false;
thread 1:
while(true == gGlobalVarLock)
{
/*wait for flag to become false*/
}
/*after the flag becomes false*/
{
mutex.lock();
gGlobalVarLock = true;
/*run some code*/
gGlobalVarLock = false;
mutex.unlock();
}
thread 2 and 3,
while(true == gGlobalVarLock)
{
/*wait for flag to become false*/
}
/*after the flag becomes false*/
{
mutex.lock();
gGlobalVarLock = true;
/*run some other code*/
gGlobalVarLock = false;
mutex.unlock();
}
现在,由于gGlobalVarLock的初始false值启动了应用程序之后,其中一个线程开始执行,并应锁定其他线程以使其无法执行。 根据我的理解,上述实现可以某种方式确保gGlobalVarLock被执行线程锁定,并且一旦执行了特定线程的Mutex.lock()下的代码,其他线程就无法访问它。 看起来它也在锁定全局变量。 但是我不知道如何。
我的代码似乎运行良好。 但是我有一个疑问。 互斥锁将锁定线程2和3的代码,因为这两个线程使用同一段代码来执行。 但是对于正在运行其他代码的线程1,锁定如何工作? 该线程中的Mutex.lock()是否确保gGlobalVarLock在执行其Mutex.lock()下的代码时被其他线程锁定。 该互斥锁是否确保gGlobalVarLock不会在运行其他代码的其他线程中更改? 我的理解是Mutex.lock()锁定不同线程使用的通用代码。 那么,在不同线程运行不同代码的情况下,如何锁定全局变量。
Mutex.lock()是否在多线程环境中锁定全局变量?
关键是,如果您在父进程中创建一个互斥对象并在多个线程之间共享,则该对象的内存将由线程共享(不是进程的线程)
如果您改为创建进程(使用fork()
),则会复制内存并且它将无法正常工作。
但是在线程之间,内存是共享的,因此对象是共享的。 您的所有线程在内存中只有一个mutex
实例。
该对象将确保一次仅一个线程正在访问位于lock
和unlock
调用之间的关键部分。
简而言之,您的代码就可以了。
互斥锁确保在lock()
之后,仅获取该互斥锁的线程才能执行代码,直到到达unlock()
调用为止。 除非您的代码非常慢,否则您可以认为它正在同时执行。 但是,每次只由一个线程执行lock()
和unlock()
之间的代码块。
互斥锁不会锁定变量,而只会锁定自身。 通过限制对互斥量后面的变量的访问,可以保护该变量,但是如果该变量是全局变量,则不能保证您在代码的其他位置可能会无意间访问它而无需通过互斥量。
例如,在您的代码中,没有人使用互斥体,直到他们已经访问了全局变量并且发现它为false。 因此,这三个线程完全有可能争夺互斥锁。
在您的示例中,全局变量似乎是多余的,您似乎正在将其用作过滤器以保护对互斥量的访问。
您可能正在寻找一种称为条件变量的东西来与您的互斥锁一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.