信号量(Mutex)麻烦

时间:2012-05-01 15:10:44

标签: c++ multithreading mutex semaphore

假设我有一个Mutex,两个线程,一个函数和一个循环(伪代码)。 功能:

void Update(){
    Mutex.enter();
    ...// time: 10 ms
    Mutex.leave();
}

Main.cpp的:

void main(){
    ...// Starting thread
    while(true)
        Update();
}

主题:

void Thread(void *){
    Mutex.enter();
    ... // 
    Mutex.leave();
}

但是函数调用不断,因此Mutex的小时间是免费的。 Thread必须进入Mutex的机会有多高?如果低,怎么解决?

2 个答案:

答案 0 :(得分:2)

如果你正在使用提升线程(link),那么我会使用yield()。它将允许任何其他“等待”线程“有机会”运行。

这也可能是win32或pthreads的做法。

编辑:顺便说一句,使用锁外的yield() 。如果它在锁内,显然那将毫无用处。

Edit2:这是不同平台的功能:

  • Win32:SwitchToThread() msdn link
  • Linux / Unix pthreads:`pthread_yield()'link

如果您不在任何这些平台上,请阅读这些链接中的说明,并查找在您的框架中执行相同操作的功能。

答案 1 :(得分:0)

从您展示的伪代码看来,线程之间似乎没有合作。如果thread2幸运地在调用第一个Update()之前获取互斥锁,那么在thread2的整个生命周期中,不会调用函数Update()函数。对我来说,它看起来像一个有缺陷的设计。如果thread2正在进行工作并且'main'线程正在调用Update()函数来监视并报告thread2线程例程中发生的任何事情的进展,那么让thread1(主要的)等待的话会更有意义。 update_required信号和thread2(正在进行工作的那个)将完成工作,然后填充一个struct变量,其中包含报告进度所需的所有数据,并发出信号thread1以使用数据并报告进度。使用这种结构变量的环形缓冲区可以完全消除对互斥体的需求。