为什么下面的代码有竞态条件?
static int i=0;
void some_fun()
{
++i;
if(2==i)
{
printf("some message");
}
}
为什么下面的代码有竞态条件?
static int i=0;
void some_fun()
{
++i;
if(2==i)
{
printf("some message");
}
}
假设这个函数是从多个线程调用的,它有一个竞争条件,因为变量i
有一个静态的存储持续时间并且它在所有线程之间共享,所以多个线程可以在它们之间竞争来修改这个变量。
问题是一个相同的变量在多个线程之间共享,这与每个线程一个的局部/自动变量不同。
如果你想避免竞争条件,你需要通过使用同步结构来同步对这个共享变量的访问,这里最简单和最相关的是互斥锁。
Race condition
当多个线程或进程同时访问共享资源时发生。
在您的代码中,共享资源是 i 变量。通常,我们称之为critical section
。
因此,如果这段代码被多个线程或进程同时访问,并对其进行修改。例如,他们将其一增加一减少。因此,数据将不一致。
希望这有帮助:)
假设这是从多个线程调用的,静态变量 i 需要受到保护。这可以通过前面提到的锁来完成,或者在这种情况下使用更有效的原子增量操作。如果你使用 gcc 编译器,它看起来像这样:
static int i=0;
void some_fun()
{
int local_i = __sync_add_and_fetch(&i, 1);
if(2==local_i)
{
printf("some message");
}
}
__sync_add_and_fetch() 函数将第二个参数添加到第一个参数并返回总和。所有这一切都作为一个原子操作。这比获取和释放锁更有效