为什么下面的代码有竞争条件?为什么以下代码中的竞态条件为
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");
}
}
假设这是从多个线程,静态变量我需要被保护的调用。 这可以使用前面提到的锁来完成,或者在这种情况下使用更高效的原子增量操作。 如果您使用的是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()函数将第二个参数去第一和返回的总和。所有这些都是作为一个原子操作。这比抓取和释放锁效率更高
假设这个功能是从多个线程调用时,它有一个争用条件,因为变量i
具有静态存储持续时间,它是所有线程之间共享,这样的多个线程可以比赛在它们之间来修改该变量。
问题是多个线程之间共享一个相同的变量,而不像本地/自动变量是每个线程一个变量。
如果你想避免竞争条件,你需要通过使用同步结构来同步对这个共享变量的访问,这里最简单和最相关的就是一个互斥体。
Race condition
发生在多个线程或进程同时访问共享资源时。
而在你的代码中,共享资源是我变量。通常,我们将其称为critical section
。
所以,如果这段代码是同时被多个线程或进程访问并修改它的。例如,它们会增加一个,并减少它。所以,数据将不一致。
希望这有助于:)
我觉得比赛你说的是关于打印消息。不是吗?
好吧。
也许有人说,如果两个线程同时调用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");
}
}
没有给出代码中的竞争条件。它不是多线程的开始。 – 2013-03-13 06:23:28
粘贴代码,您可以在其中调用some_fun()方法 – Jacek 2013-03-13 06:26:02