考虑我们有三个线程,bool status_flag[500]
数组,以及如下工作情况:
两个线程只在不同索引的status_flag
数组中写入。而第三个帖子只能读取任何索引。
所有三个线程写在不同的索引。虽然所有三个线程都读取任何索引。
在写入操作中,我们只是设置标志永远不会重置它。
status_flag [i] = true;
在阅读操作中,我们正在做类似的事情:
for(;;){ //spinning to get flag true
if(status_flag [i] == true){
//do_something ;
break;
}
}
编译器优化(分支预测)代码会发生什么?
我已经阅读了很多关于锁的内容,但仍然对结论结果感到困惑。请帮我总结一下。
答案 0 :(得分:2)
应用程序应确保限制多个控制线程(线程或进程)对任何内存位置的访问,以便没有控制线程可以读取或修改内存位置,而另一个控制线程可能正在修改它。 / p>
因此,如果没有锁定,则不允许读取其他线程可能正在编写的内存。此外,POSIX的那部分描述了哪个函数将同步线程之间的内存。在两个线程都调用其中列出的任何函数之前,您无法保证一个线程所做的更改对另一个线程可见。
答案 1 :(得分:0)
如果所有线程都在不同的索引值上运行,那么您不需要锁定。基本上它相当于使用不同的变量。 在您的代码中,未设置或修改变量i的值。所以它只读取一个特定的旗帜索引。而对于写作,你使用不同的索引,在这种情况下不需要使用锁。