同时从2个线程中读取全局变量
Reading a Global Variable from 2 threads Simultaneously
我的程序有两个线程和一个整数全局变量。假设全局变量在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何时设置?如果在创建线程之前,没有问题。
如果全局变量在创建线程时可以更改,那么您可能需要序列化线程和更改全局变量的代码。这实际上取决于应用程序的具体情况,您只需要考虑这种可能性。
如果一个线程正在更改变量,而另一个线程则在调度依赖于全局变量设置为特定值的新线程,则情况尤其如此。
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- C++:如何读取分离变量,然后读取向量
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- C++从 std::async 函数读取命名空间中的全局变量标志
- 视觉UWP C :仅编写而不是读取到全局变量
- 编译器是否可以从全局变量中读取两次,而不是存储一个局部变量
- 可能同时从不同的线程读取全局变量是否危险
- C++ pthread,两个线程读取一个全局变量
- 同时从2个线程中读取全局变量
- 并发修改和读取单个全局变量
- 如何同步读取非常频繁/写入非常罕见的全局变量的访问
- 从命令行读取常量作为全局变量