thread中的Lock和Condition

文章讲述了如何在CameraOperation类中使用Condition对象及其acquire(),release(),wait(),notify()方法来管理生产池和消费池之间的线程同步,确保主线程在图像处理完成后获取数据,避免数据未准备好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lock()中的acquire()和release()都可以用Condition()中的来替代

除了提供与 Lock 类似的 acquire() 和 release() 方法外,还提供了 wait() 和 notify() 方法

condition()分生产池和消费池,生产池可以是个While True的thread,要获取生产池的值,给到消费池,需要在生产池中

self.buf_lock.acquire()
self.array = img_buff #要获取的值
self.buf_lock.notify()
self.buf_lock.release()

在消费池中,

with self.buf_lock:
     self.buf_lock.wait()
return self.array

condition.wait() 使线程进入等待状态,直到其他线程发出信号(通过 condition.notify())来唤醒它。

如果不加wait的话,主线程和子线程就是同时运行的,会取不到子线程中我们要取的值 

GPT的解答: 

1. 在 CameraOperation 类中初始化一个 Condition 对象:
   self.cond = threading.Condition()

2. 在 Work_thread 中,在图像处理完成后,通过 acquire() 获取锁,然后调用 notify() 发送信号通知其他线程:
   self.cond.acquire()
   self.array = img_buff
   self.cond.notify()
   self.cond.release()

3. 在 Trigger_once 中,等待信号的到来,获取 self.array=img_buff 的内容:
   while self.array is None:
       self.cond.acquire()
       self.cond.wait()
       self.cond.release()

通过这种方式,Trigger_once 将会在 Work_thread 处理完图像后才会获取 self.array=img_buff 的内容,避免了数据尚未准备好的情况发生。

实际使用,这两部分代码功能一致:

    # def Trigger_once(self):
    #     if self.b_open_device:
    #         self.buf_lock.acquire()
    #         self.obj_cam.MV_CC_SetCommandValue("TriggerSoftware")
    #         self.buf_lock.wait()
    #         self.buf_lock.release()
    #     return self.array


    # 软触发一次
    def Trigger_once(self):
        if self.b_open_device:
            self.obj_cam.MV_CC_SetCommandValue("TriggerSoftware")
            with self.buf_lock:
                self.buf_lock.wait()
            return self.array

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值