-5

为什么下面的代码有竞态条件?

static int i=0;
void some_fun()
{
  ++i;
  if(2==i)
  {
    printf("some message");
  }
}
4

3 回答 3

1

假设这个函数是从多个线程调用的,它有一个竞争条件,因为变量i有一个静态的存储持续时间并且它在所有线程之间共享,所以多个线程可以在它们之间竞争来修改这个变量。

问题是一个相同的变量在多个线程之间共享,这与每个线程一个的局部/自动变量不同。

如果你想避免竞争条件,你需要通过使用同步结构来同步对这个共享变量的访问,这里最简单和最相关的是互斥锁。

于 2013-03-13T06:25:45.820 回答
0

Race condition当多个线程或进程同时访问共享资源时发生。

在您的代码中,共享资源是 i 变量。通常,我们称之为critical section

因此,如果这段代码被多个线程或进程同时访问,并对其进行修改。例如,他们将其一增加一减少。因此,数据将不一致。

希望这有帮助:)

于 2013-03-13T06:30:31.837 回答
0

假设这是从多个线程调用的,静态变量 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() 函数将第二个参数添加到第一个参数并返回总和。所有这一切都作为一个原子操作。这比获取和释放锁更有效

于 2013-03-13T07:16:23.390 回答