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

Reading a Global Variable from 2 threads Simultaneously

本文关键字:读取 全局变量 线程 2个      更新时间:2023-10-16

我的程序有两个线程和一个整数全局变量。假设全局变量在thread2开始执行之前被初始化为某个值。两个线程都在读取该变量。有任何比赛条件可能吗?

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

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

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

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

线程在调用pthread_create时可以看到的内存值也可以在新线程启动时被它看到"(内存线程之间的可见性)

因此,在这种情况下不可能出现比赛条件。

C和C++现在共享相同的线程安全方法。如果两个操作应该相对排列,但不是,则具有"未定义的行为"。

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

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

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

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

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

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