Multithreading 在多线程环境中锁定什么和不锁定什么(信号量和共享内存)
我正在实现一些简单的生产者/消费者程序,它有一些信号量和共享内存。为了简单起见,让我们假设我的程序中只有一块共享内存和一个信号量Multithreading 在多线程环境中锁定什么和不锁定什么(信号量和共享内存),multithreading,locking,semaphore,shared-memory,Multithreading,Locking,Semaphore,Shared Memory,我正在实现一些简单的生产者/消费者程序,它有一些信号量和共享内存。为了简单起见,让我们假设我的程序中只有一块共享内存和一个信号量 首先,我认为,我只需要考虑那些试图写入共享内存块的代码的关键部分。但是,由于共享内存块由1024字节组成,我无法同时读取所有数据(这不是一个原子操作),因此,当我从中读取数据时,确实有可能生成程序来并开始写入,因此读取器将获得一半旧数据,一半新数据。因此,我只能认为我还必须将共享内存读取逻辑放在“信号量”块中 现在,我有很多这样的代码: if (sharedMemor
首先,我认为,我只需要考虑那些试图写入共享内存块的代码的关键部分。但是,由于共享内存块由1024字节组成,我无法同时读取所有数据(这不是一个原子操作),因此,当我从中读取数据时,确实有可能生成程序来并开始写入,因此读取器将获得一半旧数据,一半新数据。因此,我只能认为我还必须将共享内存读取逻辑放在“信号量”块中
现在,我有很多这样的代码:if (sharedMemory[0] == '0') { ... }
在本例中,我只是在内存中寻找一个字符。我想我不必担心在这周围放信号灯,是吗
如果我有类似的东西呢
if (sharedMemory[0] == '0' && sharedMemory[1] == '1') { ... }
从我的角度来看,我猜想这是2个操作,我必须把它看作是一个关键部分,因此必须在它周围放一个信号量。我说得对吗
谢谢 一定要锁定非原子操作,检查两个不同的值被视为非原子操作,不过如果处理器不缓存结果,可以使用一些技巧检查多达四个字节或更多字节。你必须考虑你的数据是如何使用的。但基本上,任何对共享内存的访问都应该有一个信号量围绕着它。从技术上讲,在多核或多处理器系统上,唯一原子化的东西是专门记录为原子的汇编操作码。即使读取一个字节,在您读取它之前,另一个处理器出现并修改它的可能性(非常小),除非在某些情况下处理CPU缓存和对齐的内存块(有趣的线程:,有趣的读取:) 您必须使用内部保证原子性的类型,或者专门保护多线程多核系统上的访问
(在像.NET和JVM这样的IL平台上,答案可能会略有变化,因为他们自己对什么是原子的,什么不是原子的做出保证)。所以,我不明白你文章的结论是什么?我应该锁定所有东西吗?当然,被记录为原子的函数将是原子的(假设它们没有bug)。