我正在实施一些简单的生产者/消费者程序,有一些信号量和共享内存。为了简单起见,我们假设我的程序中只有一块共享内存和一个信号量。什么来锁定和什么不锁定在多线程环境(信号量和共享内存)
起初,我虽然只是考虑了试图写入共享内存块的代码的关键部分。但是,由于共享内存块由1024bytes组成,我不能同时读取所有数据(这不是一个原子操作),所以当我读它时,确实有可能生产者开始写入,所以读者将获得一半的旧数据,一半新数据。由此,我只能认为我还必须将共享内存读取逻辑放在“信号量”块中。
现在,我有很多的代码看起来像这样:
if (sharedMemory[0] == '0') { ... }
在这种情况下,我只是希望在内存中的单个字符。我想我不必担心在这附近放置一个信号灯,对吧?
而且如果不是我有类似
if (sharedMemory[0] == '0' && sharedMemory[1] == '1') { ... }
从我的角度来看,我猜测,因为这是2点的操作,我不得不认为这是一个重要的部分,因此不必把一个什么信号周围。我对吗?
谢谢!
所以,我没有得到你的文章的结论是什么?我应该锁定一切吗? – 2010-11-14 16:51:22
记录为原子的函数当然是原子的(假设它们不是越野车)。 – 2010-11-14 18:14:19