写原子功能

时间:2010-07-14 11:24:08

标签: c linux compiler-construction operating-system linux-kernel

我想用C语言实现一个原子函数,这样在执行函数时不会抢占进程或线程。

2 个答案:

答案 0 :(得分:3)

如果你在内核中并且真的需要禁用抢占(可能不是一个好主意,我希望你知道你在做什么),你可以使用preempt_disable()preempt_enable()(有关详细信息,请参阅Documentation / preempt-locking.txt)。

如果您不在内核中,那么您的选择非常有限。大多数多进程或多线程应用程序所做的是创建在访问共享资源时用于自我限制的互斥锁。 (想想典型的读写器锁。)但对于系统上的所有其他进程而言,这绝不是原子的。对于遵循相同协议的其他进程,它只是原子的。

(考虑到即使是超便宜的笔记本电脑现在同时运行多个CPU内核,但是在关键部分运行时阻止其他进程运行的目标注定要失败。)

可以为您的应用程序授予实时调度优先级,但这需要非常仔细编程,作为优先级较低的程序(例如X或ssh或bash或..)除非产生处理器或执行阻塞IO,否则不会运行。有关详细信息,请参阅sched_setscheduler(2)

答案 1 :(得分:2)

你混淆了两件事:

  • “Atomic”表示操作似乎没有运行或完全完成。
  • “Preemption”(松散地)意味着其他线程可以在你的核心上运行而不会让你屈服。

即使在非抢占式操作系统(例如经典Mac OS)上,事情仍然不能保证是原子的:

  • 中断可以随时发生(除非您也禁用中断)。
  • 即使您禁用了中断,其他核心上的代码也会运行。

了解为什么您认为需要原子操作也很有帮助。保护共享数据结构的最简单方法是使用锁。如果你在内核中,请阅读Rusty Russell的Unreliable Guide to Locking(它可能有点过时)。如果您在用户空间,只需使用pthread互斥锁。