【问题标题】:Reading a Global Variable from 2 threads Simultaneously同时从 2 个线程中读取全局变量
【发布时间】:2013-08-23 06:20:44
【问题描述】:

我的程序有 2 个线程和一个整数全局变量。假设在 thread2 开始执行之前将全局变量初始化为某个值。两个线程都在读取该变量。是否有任何竞争条件?

这些函数在我的程序中同时从 2 个线程重复执行。

void thread1(int iParam)
{
    if ( gi_Varable == iParam )
    //do something
}

void thread2(int iParam)
{
    if ( gi_Varable == iParam)
        //do something

}

【问题讨论】:

  • 是的,全局变量是线程之间共享的,但是如果gi_Varable被某个线程修改,你会发现代码有bug,你似乎没有
  • 阅读Thread can't count, giving wrong result 了解使用全局变量时何时存在竞争条件和错误。以及如何通过添加并发控制机制来解决。

标签: c++ c multithreading thread-safety mutex


【解决方案1】:

同时访问和尝试操作相同的数据是竞争条件。这里两个线程都只是从全局变量中读取,而不是尝试操作它,因此没有竞争条件。

【讨论】:

  • @OlofForshell 我已将其包含在reading from global variable not trying to manipulate it 的回答中。
【解决方案2】:

如果您询问的是 POSIX 线程,那么:

线程调用pthread_create时可以看到的内存值 新线程启动时也可以看到”(memory visibility between threads)

所以在这种情况下不可能出现竞争条件。

【讨论】:

  • @skallsp 即​​使有两个进程,对于这种特定情况也不需要同步。如果我错了,请纠正我?
  • 抱歉,由于我没有处理两个进程之间共享内存的经验,因此无法发表评论。
【解决方案3】:

如今,C 和 C++ 共享相同的线程安全方法。如果两个操作应该相对于彼此排序,那么您有未定义的行为,但不是。

在这种情况下,写操作先于线程创建,线程创建先于读操作。这意味着写入发生在读取之前。没问题。

读取之间没有测序要求。所以这也没有问题。

【讨论】:

    【解决方案4】:

    两个线程只取数据,不会相互竞争。

    仍然可能存在序列化问题,即何时设置全局变量?如果在创建线程之前没有问题。

    如果全局变量。可以在创建线程时更改,那么您可能需要序列化更改全局变量的线程和代码。这实际上取决于您的应用程序的具体情况,您只需要考虑可能性。

    如果一个线程正在更改变量,而另一个线程正在调度依赖于被设置为特定值的全局变量的新线程,则尤其如此。

    【讨论】:

      最近更新 更多