Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在多线程环境中锁定什么和不锁定什么(信号量和共享内存)_Multithreading_Locking_Semaphore_Shared Memory - Fatal编程技术网

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)。