同时从2个线程读取全局变量

时间:2013-08-23 06:20:45

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

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

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

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

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

}

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

  

线程在调用pthread_create时可以看到的内存值   当一个新线程开始“(memory visibility between threads

时,也可​​以看到它

因此在这种情况下不可能有竞争条件。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

C和C ++现在共享相同的线程安全方法。如果两个操作相对于彼此进行排序,则您具有未定义的行为,但不是。

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

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