信号量(互斥)问题

Semaphore (Mutex) trouble

本文关键字:问题 互斥 信号量      更新时间:2023-10-16

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

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

主.cpp:

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

线:

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

但是函数调用不断,所以互斥时间短是免费的。线程进入互斥锁的几率有多高?如果低,如何解决?

如果您使用的是提升线程(链接),那么我会使用yield(). 它将允许任何其他"等待"线程"有机会"运行。

可能也有win32或pthreads的方法可以做到这一点。

编辑:顺便说一下,在锁使用yield()。 如果它在锁里面,显然那是没有用的。

编辑2:以下是不同平台的功能:

  • Win32:SwitchToThread() msdn 链接。
  • Linux/Unix pthreads: 'pthread_yield()' link

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

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