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

时间:2015-07-22 06:42:42

标签: c multithreading pthreads mutex

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

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

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

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

    status_flag [i] = true;
    

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

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

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

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

2 个答案:

答案 0 :(得分:2)

POSIX is quite clear on this

  

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

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

答案 1 :(得分:0)

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