2014-03-24 62 views
0

我和我的朋友在网上发现了这个示例代码,我们正在争论它是否实现了一个关键部分。我们的观点是来回奔波,所以我们想过要求stackoverflow。关键部分示例 - 是否有效?

那么,我们是否在这里执行临界区?

int flagga[2]; 

void task0(void){ 
while(1){ 
/* some code */ 
flagga[0]=true; 
while(flagga[1]==true) /*do nothing*/; 
/* critical sektion */ 
flagga[0]=false; 
} 
} 

void task1(void){ 
while(1){ 
/* some code */ 
flagga[1]=true; 
while(flagga[0]==true) /*do nothing*/; 
/* critical section */ 
flagga[1]=false; 
} 
} 

void main(void){ 
flagga[0]=flagga[1]=false; 
startThread(task0); 
startThread(task1); 
while(1); 
} 
+0

它很接近。 http://en.wikipedia.org/wiki/Peterson%27s_algorithm –

+0

这段代码和维基百科的代码都需要将文件范围变量声明为volatile。否则,编译器优化代码时可能会发生错误。这是因为线程函数是回调函数。因此,有些编译器无法确定是否调用了某个函数。对于编译器来说,它可能看起来好像这些函数从未执行过,然后在优化期间做出错误的决定。 而且,volatile关键字最有可能不会提供硬件内存障碍,所以我认为在多核系统上存在问题。 – Lundin

回答

1

它从可能发生的饥荒遭受:如果没有任务到达内while其他已成立的flagga为true(这可能是因为您在每个任务语句之间粘粘交替)之前,都将陷入它的内部while循环。