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