2013-09-25 51 views
0

您好,我在找到以下问题的答案时遇到问题。我试图在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。

因此将在富()工作的信号()根据需要?如果没有,我必须把它放在锁中吗?如果没有,还有其他方法可以解决这个问题吗?

对不起,您的回复文字墙和感谢。

+0

除非这是某种我不能理解的超级智能设计,否则我认为你已经使用了'condition variables''非常错误。请阅读https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables – HAL

+0

我没有看到任何问题,谨慎详细说明? – TheIronChef

回答

0

对于驱动函数foo()首先调用Signal(cond)而不锁定cond是否可以?

调用pthread_cond_broadcast()pthread_cond_signal()而不是持有互斥锁是罚款和portable

的调用pthread_cond_broadcast()或调用pthread_cond_signal()函数可以由一个线程是当前是否拥有互斥体被称为是调用pthread_cond_wait()或pthread_cond_timedwait()的线程在等待期间与条件变量相关联;然而,如果需要可预测的调度行为,则该线程应该被调用pthread_cond_broadcast()或pthread_cond_signal()的线程锁定。


我明白了修改锁定的 'emergency_shutdown' 变量之外的后果。他们并不担心我太多。

至少使用原子操作来获取/设置的emergency_shutdown值,如果你不想要保护是一个互斥体,原子能不会阻止你的线程。

+0

当我发布这个问题后,我意识到我也可以使用trylock! – TheIronChef

相关问题