假设我有一个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的机会有多高?如果低,怎么解决?
答案 0 :(得分:2)
如果你正在使用提升线程(link),那么我会使用yield()
。它将允许任何其他“等待”线程“有机会”运行。
这也可能是win32或pthreads的做法。
编辑:顺便说一句,使用锁外的yield()
。如果它在锁内,显然那将毫无用处。
Edit2:这是不同平台的功能:
如果您不在任何这些平台上,请阅读这些链接中的说明,并查找在您的框架中执行相同操作的功能。
答案 1 :(得分:0)
从您展示的伪代码看来,线程之间似乎没有合作。如果thread2幸运地在调用第一个Update()之前获取互斥锁,那么在thread2的整个生命周期中,不会调用函数Update()函数。对我来说,它看起来像一个有缺陷的设计。如果thread2正在进行工作并且'main'线程正在调用Update()函数来监视并报告thread2线程例程中发生的任何事情的进展,那么让thread1(主要的)等待的话会更有意义。 update_required信号和thread2(正在进行工作的那个)将完成工作,然后填充一个struct变量,其中包含报告进度所需的所有数据,并发出信号thread1以使用数据并报告进度。使用这种结构变量的环形缓冲区可以完全消除对互斥体的需求。