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
Multithreading 线程能否争夺对单个地址的访问权?_Multithreading_Memory - Fatal编程技术网

Multithreading 线程能否争夺对单个地址的访问权?

Multithreading 线程能否争夺对单个地址的访问权?,multithreading,memory,Multithreading,Memory,取一个布尔值。一个线程正试图为其分配一个预先确定的值,而另一个线程正试图读取该值。会发生什么情况?这是一个竞争条件:一个线程会赢,另一个线程会输。哪一个在实践中是不可确定的 编辑 请注意,“赢”不一定是好事,也不一定保证不会损坏(至少在一般情况下)。这是一种竞争条件:一个线程将赢,另一个线程将输。哪一个在实践中是不可确定的 编辑 请注意,“获胜”不一定是好事,也不一定保证不会被破坏(至少在一般情况下)。我认为问题取决于体系结构。如果不考虑这一点,我总是认为它是一个执行低级指令的单CPU,操作系统

取一个布尔值。一个线程正试图为其分配一个预先确定的值,而另一个线程正试图读取该值。会发生什么情况?

这是一个竞争条件:一个线程会赢,另一个线程会输。哪一个在实践中是不可确定的

编辑


请注意,“赢”不一定是好事,也不一定保证不会损坏(至少在一般情况下)。

这是一种竞争条件:一个线程将赢,另一个线程将输。哪一个在实践中是不可确定的

编辑


请注意,“获胜”不一定是好事,也不一定保证不会被破坏(至少在一般情况下)。

我认为问题取决于体系结构。如果不考虑这一点,我总是认为它是一个执行低级指令的单CPU,操作系统能够随时切换出正在执行的线程。如果你绝对知道一条机器指令是写一个值所需要的,而一条指令是读一个值所需要的,那么我认为不可能出现“中间状态”


也就是说,我不确定我所说的多处理器有多复杂。我一直想知道实际上

我认为问题取决于架构。如果不考虑这一点,我总是认为它是一个执行低级指令的单CPU,操作系统能够随时切换出正在执行的线程。如果你绝对知道一条机器指令是写一个值所需要的,而一条指令是读一个值所需要的,那么我认为不可能出现“中间状态”

也就是说,我不确定我所说的多处理器有多复杂。我一直想知道实际上

取一个布尔值。一个线程正试图为其分配一个预先确定的值,而另一个线程正试图读取该值。会发生什么

这取决于所讨论的体系结构和语言。实际上,这通常意味着您将有一个竞争条件,“read”值可能是旧值或新值

更有趣的是,如果两个线程同时尝试写入同一个变量-如果一个线程写入
false
,而另一个线程写入
true
,则实际生成的变量可能会以任意一个值结束

为了保证正确访问,需要设置内存屏障。这在处理多个处理器甚至多个内核时尤其如此,因为CPU缓存线需要在线程写入后失效,以便单独的线程读取值。大多数语言都以这样或那样的形式支持这一点——例如,在C#中,您可以将变量标记为以帮助实现这一点,但通常仍然需要显式同步(即:锁定)

此外,如果变量写入不是单个CPU指令(即:使用联锁操作或类似操作),则必须注意显式同步读写访问-否则(在某些体系结构上)可以使变量处于第三种不确定状态

取一个布尔值。一个线程正试图为其分配一个预先确定的值,而另一个线程正试图读取该值。会发生什么

这取决于所讨论的体系结构和语言。实际上,这通常意味着您将有一个竞争条件,“read”值可能是旧值或新值

更有趣的是,如果两个线程同时尝试写入同一个变量-如果一个线程写入
false
,而另一个线程写入
true
,则实际生成的变量可能会以任意一个值结束

为了保证正确访问,需要设置内存屏障。这在处理多个处理器甚至多个内核时尤其如此,因为CPU缓存线需要在线程写入后失效,以便单独的线程读取值。大多数语言都以这样或那样的形式支持这一点——例如,在C#中,您可以将变量标记为以帮助实现这一点,但通常仍然需要显式同步(即:锁定)


此外,如果变量写入不是单个CPU指令(即:使用联锁操作或类似操作),则必须注意显式同步读写访问-否则,您可以(在某些体系结构上)使变量处于第三种不确定状态。

无需添加任何内容。但是请注意,在这种情况下,通常有硬件级别的机制来保证对特定地址、特定长度的内存的原子访问。对于较小的值,这比像
CRITICAL\u部分那样的用户模式锁更有效


请查看.Net framework或。

没有要添加的内容,以了解发生了什么。但是请注意,在这种情况下,通常有硬件级别的机制来保证对特定地址、特定长度的内存的原子访问。对于较小的值,这比像
CRITICAL\u部分那样的用户模式锁更有效


请查看.Net framework或。

“如果您完全知道一条机器指令是写入值所需的,而一条指令是读取值所需的”。”。。这并不总是正确的。CPU缓存线也可能已经过时。由于布尔值通常存储在最小的内存单元(单个字节或单个机器字)中,因此它的一部分不能有一个值,而另一部分则有不同的值。因此,读取线程将看到有效的前一个值或有效的下一个值,即使它们各自在自己的内核上运行。如果是单核多线程,则完全取决于线程何时启动