2

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

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

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

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

}
4

4 回答 4

3

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

于 2013-08-23T06:23:49.477 回答
1

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

线程在调用时可以看到的任何内存值pthread_create 也可以在新线程启动时看到”(线程之间的内存可见性

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

于 2013-08-23T06:35:47.137 回答
1

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

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

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

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

于 2013-08-23T07:03:09.077 回答
1

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

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

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

于 2013-08-23T07:57:22.730 回答