信号量(互斥)问题
Semaphore (Mutex) trouble
假设我有一个互斥体,两个线程,一个函数和一个循环(伪代码)。功能:
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 以使用数据和报告进度。使用这种结构变量的环形缓冲区可以完全消除对互斥锁的需求。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 生产者使用者在 cpp 中使用互斥锁的问题
- 使用 Swig 在成员中包装具有互斥锁的 C++ 类时出现问题
- 线程和互斥锁的使用有什么问题
- 如何修复macOS线程互斥锁性能缓慢的问题?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 互斥体在生产者-消费者问题中阻塞线程
- 包含互斥对象C++时出现套接字问题
- 信号量(互斥)问题
- concurrent_vector vs 矢量与互斥锁,线程问题与push_back
- Boost,指向互斥对象的指针,能起作用吗?boost::mutex和std::vector,不可复制的问题
- 在同步问题中,弱指针可以代替互斥锁或临界区吗?
- 为什么lock_guard可以通过unique_lock获得一个已经锁定的互斥锁?-仍然有问题
- c++多线程互斥锁问题
- 一位读者.一个作家.关于互斥锁和原子构造的一些一般问题
- 如何处理析构函数中互斥对象销毁失败的问题
- 释放互斥锁问题
- 没有正确使用互斥锁?继续过去的问题