4

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

+0

这是* Linux内核还是用户空间? – Artelius 2010-07-14 11:28:34

+0

用户空间可能吗?如果不是,那么它如何在内核空间中完成。 – Pointer 2010-07-14 11:30:29

+2

一般来说,这在抢先式多任务操作系统中是不可能的。可能会有一些奇怪的挂钩让你做到这一点,但解决这个问题更重要:为什么你首先想要做到这一点? – 2010-07-14 11:36:46

回答

3

如果您在内核是,你真的需要禁用抢占(可能不是一个好主意,我希望你知道你在做什么),你可以使用preempt_disable()preempt_enable()(见文档/抢占锁.txt的细节)。

如果你在内核之外,你的选择是非常有限的。大多数多进程或多线程应用程序所做的是创建互斥锁,以便在访问共享资源时自行限制自己。 (认为​​典型的读写器锁定。)但是,对于系统中的所有其他进程,这绝不是原子。对于遵循相同协议的其他进程而言,它是简单的原子。

(而鉴于甚至超低价笔记本电脑,这些天同时有多个正在运行的CPU内核,您阻止其他进程,而你的关键部分是运行是注定要失败运行的目标。)

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

+0

信号量锁定和释放操作是如何工作的? – Pointer 2010-07-14 11:53:07

+0

@Yogesh,如果你想知道如何使用pthread信号量,你应该开始使用'pthread_mutex_init(3)','pthread_mutex_lock(3)','pthread_mutex_unlock(3)'的手册。也许'pthread_cond_signal(3)'如果你想使用条件变量而不是裸互斥,这可能会更好地匹配你的问题域。如果你想学习如何为自己实现这些原语,我建议阅读Curt Schimmel的[现代体系结构的Unix系统:内核程序员的对称多处理和缓存](http://www.powells.com/biblio?isbn=9780201633382) – sarnold 2010-07-18 21:50:34

2

你混淆了两两件事:

  • “原子”是指操作要么似乎已经无法运行或已全部完成。
  • “抢占”(松散)意味着其他线程可以在您的核心上运行而不让您屈服。
即使是在非抢占操作系统(例如经典的Mac OS)

,事情仍然没有保证是原子的:

  • 中断可以发生在任何时间(除非你禁用中断过)。
  • 即使禁用中断,其他内核上的代码也会运行。

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

+0

谢谢,我将使用锁定 – Pointer 2010-07-14 11:59:01