如何确保VxWorks结构操作的原子性?

时间:2014-12-12 11:01:46

标签: c multithreading embedded vxworks

我在VxWorks中编写了涉及多个任务的代码。他们工作顺利。

在那个时间点,我并不关心原子操作。但后来,在阅读文献时,我发现当多个线程访问同一个变量时,原子操作很重要。

我的结构被多个任务使用,并且运行正常。但是从现在开始,我要小心。那么,是否有任何方法可以确保结构操作具有原子安全性。

3 个答案:

答案 0 :(得分:4)

您似乎在询问有关多线程基本问题/陷阱的非常一般性问题。为此,我建议你研究一下信号量,互斥量,队列等的一般主题。这个问题可能有点过于笼统,无法深入回答。

特别是关于vxWorks,操作系统有许多功能可以帮助您完成任务之间的互斥或数据传递。

我将引用semLib用于信号量,msgQLib用于消息队列(以下是vxWorks文档链接)。

http://www.vxdev.com/docs/vx55man/vxworks/ref/semLib.html#top http://www.vxdev.com/docs/vx55man/vxworks/ref/msgQLib.html#top

快乐的编码!

答案 1 :(得分:2)

如果我理解正确,你的问题很普遍。 您可以通过以下方式管理对资源的并发访问(例如全局变量):

  1. 使用信号量;每个任务在使用该资源做某事之前会“接受”信号量,然后“给予”它,二进制信号量最适合此目的
  2. 您可以在对该资源执行任务之前“锁定”该任务,然后“解锁”该任务,这样您就可以确保该任务不会重新安排,并且在您解锁任务之前不能执行任何其他任务
  3. 对于可以从中断处理程序访问资源的情况(因此N1和N2保护可能不起作用),您可以先禁用所有中断并在之后启用它们。
  4. 最后一种方法总是有效,但是如果长时间禁用中断,操作系统可能会停止正常工作(例如,超时时通信可能会失败)。

答案 2 :(得分:0)

Atomic 意味着操作将不间断地执行。因此,在执行操作或一组操作时不应该有上下文切换。在这种情况下,互斥或信号量无济于事。很少需要,如果你的代码不是低级的,你可能没问题。