2012-04-09 63 views
5

我有一小部分确定性工作,只需要十三条机器指令即可完成。因为第一条指令需要一个自制的信号量(spinlock)并且最后一条指令释放它,所以我可以安全地使用其他内核上运行的所有其他线程,因为它们试图获取并提供相同的信号量。如何避免在用户模式下抢占我的线程

当某个线程在完成其“临界区”之前中断了一个持有信号量的线程时,会出现问题。最糟糕的情况是中断会在握住信号量的同时杀死线程,或者可能会发生通常竞争信号量的线程之一分支出代码,这些代码可能会产生导致死锁的中断。

当他们分支到我无法控制的代码部分时,我没有办法与这些其他线程同步。我认为我需要禁用中断,就像我以前在VxWorks中使用的那样,当我在内核模式下运行时会这样做。它总是十三条指令,如果在必须完成所有十三条指令之前我必须完成中断,我总是完全安全。哦,这是我所有的内部数据,除此之外,自制的信号灯没有任何东西可以锁定其他任何东西。

我读过几个我认为很接近的答案。大部分都与Windows API上的Critical Section调用有关(错误的操作系统,但也许是正确的概念)。大多数错误的解决方案都假设我可以让所有有问题的线程使用我用pthread库创建的互斥锁。

我需要在Linux和Solaris上的C/C++中使用此解决方案。

约翰尼崩溃的问题是非常接近 prevent linux thread from being interrupted by scheduler

KermitG也 Can I prevent a Linux user space pthread yielding in critical code?

感谢您的考虑。

+3

使用线程库中的互斥体(pthread)并仔细阅读文档。不要实现你自己的同步原语。并行编程很难:) – 2012-04-09 20:52:07

+1

@RafałRawicki:“不要做任何事情,因为它很难。”他可能只是需要,因为互斥体是废话。 – Cartesius00 2012-06-24 17:12:17

+0

[防止Linux线程被调度程序中断]可能的重复(http://stackoverflow.com/questions/2595735/prevent-linux-thread-from-being-interrupted-by-scheduler) – 2015-09-23 19:57:55

回答

3

您可能无法阻止抢占用户模式线程。关键部分(以及所有其他同步对象)可防止线程发生冲突,但它们决不会阻止它们被操作系统抢占。

如果您的其他线程分支到上超时东西,而这东西可能导致死锁 - 你有一个设计问题。

一个正确的设计应该是最悲观的:抢占可能会发生在无处不在的时间。

+0

进一步的研究让我内置的编译器提供的原子函数。例如GCC 4.7手册,6.52节介绍了原子操作。我相信我需要一个__atomic_thread_fence,但我不确定是否提供了我需要的抢占保护。 – wapadomo 2012-04-10 14:57:38