在这种情况下我真的需要互斥锁吗?

考虑我们有三个线程, bool status_flag[500]数组,以及如下工作情况:

  1. 两个线程只在不同索引处写入status_flag数组。 而第三个线程只读取任何索引。

  2. 所有三个线程写在不同的索引。 虽然所有三个线程都在读取任何索引。

在写入操作中,我们只是设置标志永远不会重置它。

 status_flag [i] = true; 

在阅读操作中,我们正在做类似的事情:

  for(;;){ //spinning to get flag true if(status_flag [i] == true){ //do_something ; break; } } 

如果编译器优化(分支预测)代码会发生什么?

我已经阅读了很多关于锁的内容,但仍然对结论结果感到困惑。 请帮我总结一下。

POSIX对此很清楚 :

应用程序应确保限制多个控制线程(线程或进程)对任何内存位置的访问,以便没有控制线程可以读取或修改内存位置,而另一个控制线程可能正在修改它。

因此,如果没有锁定,则不允许读取其他线程可能正在编写的内存。 此外,POSIX的那部分描述了哪个函数将同步线程之间的内存。 在两个线程都调用其中列出的任何函数之前,您无法保证一个线程所做的更改对另一个线程可见。

如果所有线程都在不同的索引值上运行,那么您不需要锁定。 基本上它相当于使用不同的变量。 在您的代码中,未设置或修改变量i的值。 所以它只读取一个特定的旗帜索引。 而对于写作你使用不同的索引,在这种情况下不需要使用锁。