- 主题:一个std::mutex的问题
比如有一个全局变量 mutex mt;
线程A先调用mt.lock(),
然后线程B调用mt.lock(),
然后线程C调用mt.lock(),
然后线程D调用mt.lock(),
等到A调用mt.unlock()后,线程B、C、D中的mt.lock哪个先返回?
是一定按照lock的先后顺序吗?
--
FROM 121.69.79.*
没明确说就是未定义吧
--
FROM 119.103.226.*
我记得标准没说一定按照顺序。
【 在 capriccio 的大作中提到: 】
: 比如有一个全局变量 mutex mt;
: 线程A先调用mt.lock(),
: 然后线程B调用mt.lock(),
: ...................
--
FROM 158.140.1.*
【 在 capriccio 的大作中提到: 】
: 比如有一个全局变量 mutex mt;
: 线程A先调用mt.lock(),
: 然后线程B调用mt.lock(),
: ...................
楼上说的都对
stl 里的 mutex 是封装的操作系统提供的 native 互斥锁,后者不是公平锁,不遵循 FIFO。
楼主这里应该用 semaphore
--
FROM 124.251.33.*
单个信号量的semaphore可以实现FIFO?
我搜了一圈没看到有关说明啊
【 在 hanjiamajia (hanjiamajia) 的大作中提到: 】
: 楼上说的都对
: stl 里的 mutex 是封装的操作系统提供的 native 互斥锁,后者不是公平锁,不遵循 FIFO。
: 楼主这里应该用 semaphore
: ...................
--
FROM 115.171.203.*
其实我是想实现如下功能:
mutex mt;
线程A:
while(true){
mt.lock();
//进行一些需要等待的操作,然后产生一些数据
mt.unlock();
}
线程B:
while(true){
mt.lock();
//取走线程A产生的数据,用时很短
mt.unlock();
//处理数据,以及有关的其它操作
}
希望线程B正在在等待时,mt被线程A unlock后立刻被线程B lock,而不是被线程A再次lock。
【 在 hanjiamajia (hanjiamajia) 的大作中提到: 】
: 楼上说的都对
: stl 里的 mutex 是封装的操作系统提供的 native 互斥锁,后者不是公平锁,不遵循 FIFO。
: 楼主这里应该用 semaphore
: ...................
--
FROM 115.171.203.*
觉得互斥体不适合这种情况,
你需要的是需要有阻塞的同步功能,
我一般用TCP,A做完了通知B,A处于阻塞读
【 在 capriccio (小草|长相守) 的大作中提到: 】
: 其实我是想实现如下功能:
: mutex mt;
: 线程A:
: ...................
--
FROM 36.161.144.*
你这应该用条件变量
mutex不是这么用的
【 在 capriccio (小草|长相守) 的大作中提到: 】
: 标 题: 一个std::mutex的问题(换个问法)
: 发信站: 水木社区 (Tue Sep 22 20:53:14 2020), 站内
:
: 其实我是想实现如下功能:
: mutex mt;
: 线程A:
: while(true){
: mt.lock();
: //进行一些需要等待的操作,然后产生一些数据
: mt.unlock();
: }
:
: 线程B:
: while(true){
: mt.lock();
: //取走线程A产生的数据,用时很短
: mt.unlock();
: //处理数据,以及有关的其它操作
: }
:
: 希望线程B正在在等待时,mt被线程A unlock后立刻被线程B lock,而不是被线程A再次lock。
:
: 【 在 hanjiamajia (hanjiamajia) 的大作中提到: 】
: : 楼上说的都对
: : stl 里的 mutex 是封装的操作系统提供的 native 互斥锁,后者不是公平锁,不遵循 FIFO。
: : 楼主这里应该用 semaphore
: : ...................
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 115.171.203.*]
--
FROM 171.83.7.*
【 在 capriccio 的大作中提到: 】
: 比如有一个全局变量 mutex mt;
: 线程A先调用mt.lock(),
: 然后线程B调用mt.lock(),
: ...................
每个系统不同。我见过一个linux的,后进先出。为此我还改变流程去解决次序问题。
后进先出最大的问题是,如果繁忙,压在栈底的任务可能永远得不到执行。
--
修改:ylh1969 FROM 221.221.53.*
FROM 221.221.53.*
学习了一下条件变量,确实适用我的需求。
但有个帖子说条件变量存在虚假唤醒和通知丢失的现象,整的我很心虚
https://blog.csdn.net/y396397735/article/details/81272752
【 在 libgcc (承接各种水军业务) 的大作中提到: 】
: 你这应该用条件变量
: mutex不是这么用的
--
FROM 115.171.203.*