我的程序有2个线程和一个整数全局变量。假设在thread2开始执行之前将全局变量初始化为某个值。两个线程都从该变量读取。有没有竞争条件?
这些函数在我的程序中同时重复执行2个线程。
void thread1(int iParam)
{
if ( gi_Varable == iParam )
//do something
}
void thread2(int iParam)
{
if ( gi_Varable == iParam)
//do something
}
答案 0 :(得分:3)
访问并尝试同时操作相同的数据是竞争条件。这两个线程只是从全局变量中读取而不是试图操纵它,因此没有竞争条件。
答案 1 :(得分:1)
如果您询问POSIX线程,那么:
线程在调用
时,也可以看到它pthread_create
时可以看到的内存值 当一个新线程开始“(memory visibility between threads)
因此在这种情况下不可能有竞争条件。
答案 2 :(得分:1)
两个线程只获取数据,它们不会相互竞争。
仍然可能存在序列化问题,因为全局变量设置何时?如果在创建线程之前,没问题。
如果全局变量。可以在创建线程时进行更改,然后您可能需要序列化更改全局变量的线程和代码。这实际上取决于您的应用程序的具体情况,您只需要考虑这种可能性。
如果一个线程正在更改变量,而另一个线程正在调度依赖于全局变量设置为特定值的新线程,则尤其如此。
答案 3 :(得分:1)
C和C ++现在共享相同的线程安全方法。如果两个操作相对于彼此进行排序,则您具有未定义的行为,但不是。
在这种情况下,写入操作先于线程创建,该操作先于读取操作。这意味着写发生在读取之前。没问题。
读取之间没有排序要求。所以这也没问题。