2013-03-13 32 views
-5

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

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

没有给出代码中的竞争条件。它不是多线程的开始。 – 2013-03-13 06:23:28

+0

粘贴代码,您可以在其中调用some_fun()方法 – Jacek 2013-03-13 06:26:02

回答

0

假设这是从多个线程,静态变量我需要被保护的调用。 这可以使用前面提到的锁来完成,或者在这种情况下使用更高效的原子增量操作。 如果您使用的是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()函数将第二个参数去第一和返回的总和。所有这些都是作为一个原子操作。这比抓取和释放锁效率更高

1

假设这个功能是从多个线程调用时,它有一个争用条件,因为变量i具有静态存储持续时间,它是所有线程之间共享,这样的多个线程可以比赛在它们之间来修改该变量。

问题是多个线程之间共享一个相同的变量,而不像本地/自动变量是每个线程一个变量。

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

0

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

而在你的代码中,共享资源是我变量。通常,我们将其称为critical section

所以,如果这段代码是同时被多个线程或进程访问并修改它的。例如,它们会增加一个,并减少它。所以,数据将不一致。

希望这有助于:)

0

我觉得比赛你说的是关于打印消息。不是吗?

好吧。

也许有人说,如果两个线程同时调用some_fun,则只会打印一条消息。

但是,在特殊情况下,您将看到该消息两次。

void some_fun() 
{ 
    ++i; 
    // <- Assume, The value of i is 2, and program counter of both threads are here 
    if(2==i) 
    { 
    printf("some message"); 
    } 
} 

现在,想想线程#1检查i==2并打印消息。而CPU的控制给了线程#2,然后该线程检查i==2并再次打印该消息。

有许多解决方案,以锁定和同步这个程序如互斥实现以下目标:

void some_fun() 
{ 
    if(atomic_increment_and_test(i, 2)) 
    { 
    printf("some message"); 
    } 
} 
相关问题