Embedded 围绕单个单词读写的互斥体

Embedded 围绕单个单词读写的互斥体,embedded,word,mutex,Embedded,Word,Mutex,如果您的多线程应用程序在线程之间共享word变量(即32位系统上的-32位数据类型),是否有必要使用互斥锁保护对该word的读写?一般来说,是,您应该使用互斥锁同步访问。即使您认为对内存位置的写入是“原子的”,CPU也可能会重新排序对该内存进行读写的指令,从而导致不必要的行为。此外,在多核或多CPU系统上,如果没有同步,对共享内存位置的写入可能不会立即被其他核/CPU看到 有关更多信息,请参阅Wikipedia文章。一般来说,是,您应该使用互斥锁同步访问。即使您认为对内存位置的写入是“原子的”,

如果您的多线程应用程序在线程之间共享word变量(即32位系统上的-32位数据类型),是否有必要使用互斥锁保护对该word的读写?

一般来说,,您应该使用互斥锁同步访问。即使您认为对内存位置的写入是“原子的”,CPU也可能会重新排序对该内存进行读写的指令,从而导致不必要的行为。此外,在多核或多CPU系统上,如果没有同步,对共享内存位置的写入可能不会立即被其他核/CPU看到


有关更多信息,请参阅Wikipedia文章。

一般来说,,您应该使用互斥锁同步访问。即使您认为对内存位置的写入是“原子的”,CPU也可能会重新排序对该内存进行读写的指令,从而导致不必要的行为。此外,在多核或多CPU系统上,如果没有同步,对共享内存位置的写入可能不会立即被其他核/CPU看到


有关更多信息,请参阅Wikipedia文章。

而不是讨论缓存、多核、无序执行等。我只提供一个简单的示例来说明为什么要使用互斥(或其他互斥技术,例如中断操作等)

为了将一个变量增加一个(至少在我现在处理的大多数架构上是这样),您必须将值从内存读取到寄存器,调整寄存器中的值,然后将其写回内存。假设我们有两个线程,高优先级A和低优先级B。采用以下方案:

  • 线程B将“x”从内存读入寄存器(值为5)
  • 线程B将寄存器的值增加到6
  • 线程A优先于线程B
  • 线程A将“x”读入寄存器(内存中的值仍然是5,对吗?)
  • 线程将寄存器的值递增至6
  • 线程A将值6写回内存
  • 线程A进入睡眠状态
  • 线程B唤醒,并将其寄存器值6写回内存
现在两个线程都增加了值,但只增加了一个。

如果这是电梯楼层数、感应到的心跳数或航天飞机倒计时值(好的,这将是一个递减值),我们可能会遇到问题

请注意,有些架构(通常是CISC)可以原子地执行此增量操作,最好不要做此假设(您好,可移植性和正确性)

注意:在某些情况下-但不要这样做--如果您有一个编写器和多个读卡器,则可以不使用互斥锁。例如,可能一个ISR增加了一个勾号计数或其他什么,而其他线程/任务会经常出现并读取它


我想我想说的一点是,保护共享数据总是一个好主意,即使你认为你可以不使用它。如果你想“去突击队”,你真的必须知道你在做什么,即使这样,同样的代码明天移植到一个新的体系结构时可能会中断。

而不是谈论缓存、多核、无序执行等。我只提供一个简单的例子来说明为什么要使用互斥(或其他互斥技术,如中断操作等)

为了将一个变量增加1—至少在我现在处理的大多数架构上—您必须将值从内存读取到寄存器,调整寄存器中的值,然后将其写回内存。假设我们有两个线程,高优先级a和低优先级B。采用这种情况:

  • 线程B将“x”从内存读入寄存器(值为5)
  • 线程B将寄存器的值增加到6
  • 线程A优先于线程B
  • 线程A将“x”读入寄存器(内存中的值仍然是5,对吗?)
  • 线程将寄存器的值递增至6
  • 线程A将值6写回内存
  • 线程A进入睡眠状态
  • 线程B唤醒,并将其寄存器值6写回内存
现在两个线程都增加了值,但只增加了一个。

如果这是电梯楼层数、感应到的心跳数或航天飞机倒计时值(好的,这将是一个递减值),我们可能会遇到问题

请注意,有些架构(通常是CISC)可以原子地执行此增量操作,最好不要做此假设(您好,可移植性和正确性)

注意:在某些情况下-但不要这样做-如果您有一个写入程序和多个读取程序,则可以不使用互斥锁。例如,ISR可能会增加勾号计数或其他任何内容,而其他线程/任务会经常出现并读取它


我想我想说的是,保护共享数据总是一个好主意,即使你认为没有它你也可以逃脱。如果你想“去突击队”,您真的必须知道自己在做什么,即使这样,明天将同一代码移植到新体系结构时,它也可能会中断。

这是我们小组讨论的重点。但是,我不认为在变量的读/写周围设置保护会有什么不同。您必须执行“take”“read”“increment”“write”操作e“give”,将互斥体从读/写函数中取出以执行此操作。如果在读和写函数中“take”“read”“give”“increment”“take”“write”“give”放入互斥体,则在“increment”操作之前或之后抢占时会出现相同的抢占问题。我认为这总是两个写入程序的问题,而不是他解释了我问这个问题的原因。是的,你绝对需要采取读-修改-写-给的方式。正如你所指出的,另一种模式根本不起作用。读-修改-给