我想用C语言实现一个原子函数,以便进程或线程在执行函数时不会被抢占。编写原子函数
编写原子函数
回答
如果您在内核是,你真的需要禁用抢占(可能不是一个好主意,我希望你知道你在做什么),你可以使用preempt_disable()
和preempt_enable()
(见文档/抢占锁.txt的细节)。
如果你在内核之外,你的选择是非常有限的。大多数多进程或多线程应用程序所做的是创建互斥锁,以便在访问共享资源时自行限制自己。 (认为典型的读写器锁定。)但是,对于系统中的所有其他进程,这绝不是原子。对于遵循相同协议的其他进程而言,它是简单的原子。
(而鉴于甚至超低价笔记本电脑,这些天同时有多个正在运行的CPU内核,您阻止其他进程,而你的关键部分是运行是注定要失败运行的目标。)
您可能授予您的应用程序实时调度优先权,但这需要仔细编程,因为较低优先级的程序(例如X或ssh或bash或..)将不会运行,除非您产生处理器或执行阻塞IO。有关详细信息,请参见sched_setscheduler(2)
。
信号量锁定和释放操作是如何工作的? – Pointer 2010-07-14 11:53:07
@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
你混淆了两两件事:
- “原子”是指操作要么似乎已经无法运行或已全部完成。
- “抢占”(松散)意味着其他线程可以在您的核心上运行而不让您屈服。
,事情仍然没有保证是原子的:
- 中断可以发生在任何时间(除非你禁用中断过)。
- 即使禁用中断,其他内核上的代码也会运行。
它也有助于知道为什么你认为你需要原子操作。保护共享数据结构的最简单方法是使用锁。如果您在内核中,请阅读Rusty Russell的Unreliable Guide to Locking(它可能有点过时)。如果你在用户空间中,只需使用pthread互斥锁。
谢谢,我将使用锁定 – Pointer 2010-07-14 11:59:01
- 1. 如何编写函数原型?
- 2. 编写一个原型函数(C++)
- 3. 如何在Java中编写原子函数?
- 4. 使用gcc原子内置函数的原子交换函数
- 5. Javascript函数重写原型
- 6. 编写谓词添加原子
- 7. 原型函数中的Javascript子函数
- 8. 编写php函数
- 9. 编写Array.every()函数
- 10. 编写Lp范数函数
- 11. 原子编辑器中的函数参数样式
- 12. Firebase原子写入
- 13. 块级原子写
- 14. 如何在Javascript中的原型函数中编写递归函数?
- 15. 为什么用这种方式编写MDC原型函数?
- 16. 明智的方式来编写函数原型
- 17. 在C++中编写原型构造函数
- 18. 为引导程序编写函数原型dateRangePicker
- 19. 如何在Lua中使打印或写入函数原子化?
- 20. 为ggplot编写函数
- 21. 如何编写php函数
- 22. 编写字典函数
- 23. 在Java中编写函数?
- 24. 在Prolog中编写函数
- 25. 如何编写saveTable函数?
- 26. 用numpy编写train_test_split函数
- 27. 高效编写函数
- 28. php编写的sql函数
- 29. 编写异步javascript函数
- 30. 帮助编写getstring函数
这是* Linux内核还是用户空间? – Artelius 2010-07-14 11:28:34
用户空间可能吗?如果不是,那么它如何在内核空间中完成。 – Pointer 2010-07-14 11:30:29
一般来说,这在抢先式多任务操作系统中是不可能的。可能会有一些奇怪的挂钩让你做到这一点,但解决这个问题更重要:为什么你首先想要做到这一点? – 2010-07-14 11:36:46