日期:2014-05-16  浏览次数:20749 次

linux多线程问题请教
有1对线程,其中一个(线程1)负责视频采集(每秒25帧,由select负责管理读取数据),另外一个(线程2)负责处理报警信息,当确认报警信号时将另外一个线程采集的视频存储处理;要求在没有报警的时候采集视频线程不停的采集(不存储,在内存中实时更新),保证报警来时存储的视频是报警时刻视频;
问题来了:线程2接收到有效报警时如何告知线程1停止视频采集转而到存储处理呢?如果通过mutex加锁利用全局变量传递的话则线程1的while循环在select之前会不停的加锁解锁查看线程2处理的变量,这样效率是不是太低了?关键我的程序里有4对这样的线程,如果利用这种方法感觉不好,请问有什么好的方法吗?

------解决方案--------------------
假设信号量mutex,报警标志位alarm
线程1 :
while(1)
{
   lock(mutex)
    if(1==alarm)
   {
      存储操作
       alarm = 0
   }
   unlock(mutex)

   视频采集操作
}
线程2:
lock(mutex)
alarm = 1
unlock(mutex)
如果,线程2触发比较频繁,线程1的临界区可以使用变量替换,把存储操作提取出来
------解决方案--------------------
条件变量可以挂起, 另外不要杞人忧天, 加锁不代表没有效率, 先试过再说.
------解决方案--------------------
引用:
Quote: 引用:

条件变量可以挂起, 另外不要杞人忧天, 加锁不代表没有效率, 先试过再说.
况且你加锁的话,如果变量尚未被解锁,线程肯定挂起了,如果线程挂起了还有效率么?我说的效率不单指加锁解锁的开销,会影响到数据的采集甚至


方法很多的,在条件变量上超时等待就行了,每次计算好超时时间是多少。
或者用pipe,读端放到select中,等等。都可以的。
------解决方案--------------------
根据楼主描述的应用,业务可能是这样的,视频采集线程负责采集实时视频,如果有告警发生了,视频采集线程仍旧做视频采集的工作,只不过是增加了一步存储的操作,而并不是就不采集了。不采集视频了,哪还有数据给你存储?
我觉得简单点,视频采集线程在判断告警标志时不加锁,其它4个告警处理线程在修改这个标志时需要做互斥处理。
------解决方案--------------------
带超时的挂起很多啊,条件变量timedwait,信号量semtimedop,select,等等等等。
------解决方案--------------------
是否可以在视频采集中每隔一个时间就sleep一下。