【问题标题】:Global data behaviour in Multi-thread environment, C++多线程环境中的全局数据行为,C++
【发布时间】:2016-08-26 05:33:14
【问题描述】:

我有一个运行三个线程的应用程序。所有三个线程都在根据全局变量的状态进行一些操作。 2 个线程正在运行相同的代码,1 个线程正在运行另一段代码。

例如:

全局变量初始值为假

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 的 init false 值导致应用程序启动后,其中一个线程开始执行,并且应该锁定其他线程以使其无法执行。根据我的理解,上述实现以某种方式确保 gGlobalVarLock 被执行线程锁定,并且一旦任何特定线程的 mutex.lock() 下的代码正在执行,就没有其他线程可以访问它。看起来它也在锁下锁定全局变量。但我不知道怎么做。

我的代码似乎运行良好。但我有一个疑问。 Mutex 将锁定线程 2 和 3 的代码,因为这两个线程使用同一段代码执行。但是对于运行其他一些代码的线程 1,锁定是如何工作的?该线程中的 mutex.lock() 是否确保 gGlobalVarLock 在其 mutex.lock() 下执行代码时为其他线程锁定。该互斥锁是否确保 gGlobalVarLock 不会更改我正在运行其他代码的其他线程?我的理解是 mutex.lock() 锁定不同线程使用的通用代码。那么在不同线程运行不同代码的情况下,全局变量如何被锁定。

mutex.lock() 是否会在多线程环境中锁定全局变量?

【问题讨论】:

  • 顺便说一句,你从来没有显示/告诉过mutex的类型。
  • 它在我的应用程序中具有这些线程的全局互斥锁

标签: c++ multithreading


【解决方案1】:

关键是如果你在父进程中创建一个互斥对象并在多个线程之间共享,这个对象的内存是由线程共享的(那些不是进程)

如果您改为创建进程(使用fork()),内存将被复制,但它不会工作。

但是在线程之间,内存是共享的,所以对象是共享的。您的所有线程在内存中都有一个 mutex 实例。

该对象将确保一次只有一个线程访问位于lockunlock 调用之间的临界区。

简而言之,你的代码没问题。

【讨论】:

  • 你的意思是只有它们之间的共享资源/内存被互斥锁锁定?
  • 不,内存由线程共享(否则您将无法访问您的布尔值/查看其值的变化)。只是互斥对象在操作系统级别受到了排除机制的保护。
  • 所以互斥锁只保护内存,没有别的?
  • mutex 确保当当前线程进入自己的临界区时,没有其他线程正在执行它们的临界区。这涉及内存、文件和所有共享资源。
【解决方案2】:

互斥锁确保在lock() 之后,只有获得互斥锁的线程才能执行代码,直到到达unlock() 调用。除非您的代码非常慢,否则您可以认为它正在同时执行。但是lock()unlock() 之间的代码块每次只会由一个线程执行。

【讨论】:

    【解决方案3】:

    互斥锁不会锁定变量,它只会锁定自己。通过限制对互斥体后面的变量的访问,您可以保护该变量,但如果该变量是全局变量,则无法保证您代码中的其他地方可能会在不通过互斥体的情况下无意中访问它。

    例如,在您的代码中,没有人使用互斥锁,直到他们已经访问了全局变量并发现它为假。所以完全有可能三个线程都争夺互斥锁。

    在您的示例中,全局变量似乎是多余的,您似乎将其用作过滤器来保护对互斥体的访问。

    您可能正在寻找与互斥锁结合使用的称为条件变量的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多