Embedded 围绕单个单词读写的互斥体
如果您的多线程应用程序在线程之间共享word变量(即32位系统上的-32位数据类型),是否有必要使用互斥锁保护对该word的读写?一般来说,是,您应该使用互斥锁同步访问。即使您认为对内存位置的写入是“原子的”,CPU也可能会重新排序对该内存进行读写的指令,从而导致不必要的行为。此外,在多核或多CPU系统上,如果没有同步,对共享内存位置的写入可能不会立即被其他核/CPU看到Embedded 围绕单个单词读写的互斥体,embedded,word,mutex,Embedded,Word,Mutex,如果您的多线程应用程序在线程之间共享word变量(即32位系统上的-32位数据类型),是否有必要使用互斥锁保护对该word的读写?一般来说,是,您应该使用互斥锁同步访问。即使您认为对内存位置的写入是“原子的”,CPU也可能会重新排序对该内存进行读写的指令,从而导致不必要的行为。此外,在多核或多CPU系统上,如果没有同步,对共享内存位置的写入可能不会立即被其他核/CPU看到 有关更多信息,请参阅Wikipedia文章。一般来说,是,您应该使用互斥锁同步访问。即使您认为对内存位置的写入是“原子的”,
有关更多信息,请参阅Wikipedia文章。一般来说,是,您应该使用互斥锁同步访问。即使您认为对内存位置的写入是“原子的”,CPU也可能会重新排序对该内存进行读写的指令,从而导致不必要的行为。此外,在多核或多CPU系统上,如果没有同步,对共享内存位置的写入可能不会立即被其他核/CPU看到
有关更多信息,请参阅Wikipedia文章。而不是讨论缓存、多核、无序执行等。我只提供一个简单的示例来说明为什么要使用互斥(或其他互斥技术,例如中断操作等) 为了将一个变量增加一个(至少在我现在处理的大多数架构上是这样),您必须将值从内存读取到寄存器,调整寄存器中的值,然后将其写回内存。假设我们有两个线程,高优先级A和低优先级B。采用以下方案:
- 线程B将“x”从内存读入寄存器(值为5)
- 线程B将寄存器的值增加到6
- 线程A优先于线程B
- 线程A将“x”读入寄存器(内存中的值仍然是5,对吗?)
- 线程将寄存器的值递增至6
- 线程A将值6写回内存
- 线程A进入睡眠状态
- 线程B唤醒,并将其寄存器值6写回内存
我想我想说的一点是,保护共享数据总是一个好主意,即使你认为你可以不使用它。如果你想“去突击队”,你真的必须知道你在做什么,即使这样,同样的代码明天移植到一个新的体系结构时可能会中断。而不是谈论缓存、多核、无序执行等。我只提供一个简单的例子来说明为什么要使用互斥(或其他互斥技术,如中断操作等) 为了将一个变量增加1—至少在我现在处理的大多数架构上—您必须将值从内存读取到寄存器,调整寄存器中的值,然后将其写回内存。假设我们有两个线程,高优先级a和低优先级B。采用这种情况:
- 线程B将“x”从内存读入寄存器(值为5)
- 线程B将寄存器的值增加到6
- 线程A优先于线程B
- 线程A将“x”读入寄存器(内存中的值仍然是5,对吗?)
- 线程将寄存器的值递增至6
- 线程A将值6写回内存
- 线程A进入睡眠状态
- 线程B唤醒,并将其寄存器值6写回内存
我想我想说的是,保护共享数据总是一个好主意,即使你认为没有它你也可以逃脱。如果你想“去突击队”,您真的必须知道自己在做什么,即使这样,明天将同一代码移植到新体系结构时,它也可能会中断。这是我们小组讨论的重点。但是,我不认为在变量的读/写周围设置保护会有什么不同。您必须执行“take”“read”“increment”“write”操作e“give”,将互斥体从读/写函数中取出以执行此操作。如果在读和写函数中“take”“read”“give”“increment”“take”“write”“give”放入互斥体,则在“increment”操作之前或之后抢占时会出现相同的抢占问题。我认为这总是两个写入程序的问题,而不是他解释了我问这个问题的原因。是的,你绝对需要采取读-修改-写-给的方式。正如你所指出的,另一种模式根本不起作用。读-修改-给