您好,我在找到以下问题的答案时遇到问题。我试图在Linux上实现一个应用层驱动程序,该驱动程序执行一些IO,但需要有一些非阻塞接口函数。从本质上讲,会有永远只能是在这种环境中两个线程,线程A和B.我可以在关键锁之外使用pthread信号吗
请看下面的例子:
Class Driver
{
void foo()
{
emergency_shutdown = true;
Signal(cond)
}
void thread_loop()
{
Lock(cond)
while (true)
{
if (emergency_shutdown)
{
// Do an atomic IO Operation #1 that could take 5ms
// For example: Send an emergency shutdown packet
emergency_shutdown = false;
}
else
{
// do an atomic IO Operation #2 that could take 100ms
}
Signal(cond)
CondWait(cond, 1000); // 1 second wait.
}
Unlock(cond)
}
}
Class HigherLayer
{
...
powerfail_handler() // Function only has 20ms to run before power is lost
{
// POWER FAIL DETECTED!
// Do some important stuff
Driver::foo() // Force shutdown of device
// Do some other important stuff
// ... Power eventually lost but hopefully we did all the
// important stuff in this function.
}
...
}
在上面的例子..线程A基本上这是运行驱动程序线程'thread_loop()'和线程B是HigherLayer线程,它会执行一大堆东西,并在检测到powerfail时调用powerfail_handler。
主要问题是这样的: 驱动程序函数foo()首先调用Signal(cond)而不锁定cond可以吗?我不想锁定cond的原因是因为我不想要powerfail_handler会调用foo()的任何可能的情况,并且它必须围绕100ms等待锁释放。
我明白了修改锁定的“emergency_shutdown”变量之外的后果。他们并不担心我太多。
我也明白,如果在100ms窗口中调用foo()时,线程A正在完成IO操作#2,那么我所期望的IO操作#1不会发生(因为电源将会在有机会这样做之前就已经失去了)。这也没关系,我没有办法解决这个问题,只能忍受它,但在这种情况下,我不想被阻挡在foo()上,并错过了在线程B中执行'其他重要的东西'这就是为什么我没有在foo()中锁定)。
我只是想确保,如果线程A正在等待(这应该是这样90%的时间),我想,以表示它是不再等待,做IO操作#1。
因此将在富()工作的信号()根据需要?如果没有,我必须把它放在锁中吗?如果没有,还有其他方法可以解决这个问题吗?
对不起,您的回复文字墙和感谢。
除非这是某种我不能理解的超级智能设计,否则我认为你已经使用了'condition variables''非常错误。请阅读https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables – HAL
我没有看到任何问题,谨慎详细说明? – TheIronChef