C语言多线程使用pthread条件变量出现信号丢失问题求解
问题成因分析
- 条件变量的信号没有持久化特性:
pthread_cond_broadcast()仅对调用时刻已经阻塞在pthread_cond_wait()的线程生效,如果发信号时没有线程在等待该条件变量,信号会被直接丢弃,不会被存储起来供后续到达的wait调用消费。 - 二进制状态标记导致事件被合并:你定义的
avail是仅支持0/1两种取值的二进制标记,而非事件计数器。当消费者处理完一次事件、将avail置为0释放锁后,还没来得及重新加锁进入pthread_cond_wait()状态,生产者可能已经连续多次执行了「将avail置为1、释放锁、发信号」的逻辑:- 第一次生产者置
avail=1发信号时,消费者还没进入wait状态,信号直接丢失 - 后续生产者再置
avail=1时,avail本身已经是1,状态没有产生新的变化,对应发出的信号也没有实际待处理的事件匹配 - 等到消费者终于加锁进入判断逻辑时,只会看到
avail=1,仅处理一次事件,中间生产者发送的多次信号全部被合并为一次处理,和你输出里连续8次发信号只收到1次的现象完全吻合。
- 第一次生产者置
- 生产速度远高于消费速度放大了信号丢失概率:你的生产者逻辑非常轻量,执行一轮循环的速度远快于消费者处理一轮事件的速度,进一步放大了上述信号丢失、事件合并的问题。
内容的提问来源于stack exchange,提问作者CaptainHb
相关产品推荐
相关产品推荐

