当前位置: 首页 > news >正文

低概率发生调用`pthread_cond_wait`的线程没有被唤醒

低概率发生调用pthread_cond_wait的线程没有被唤醒

背景:

你是否也踩过坑,在A线程调用pthread_cond_wait等待,在B线程调用pthread_cond_signal唤醒A线程进行工作处理,然后在某一次用户产品反馈中发现了低概率问题。A线程像是卡住了,B线程并没有成功唤醒A线程,而你只是凭借着经验推测着,并没有相关的日志给到你足够证据的支撑。以下我们来了解这两个函数的用法,也许问题会聊暗花明又一村。

一、函数功能概述

pthread_cond_signal函数

该函数用于向条件变量发送一个信号。当调用pthread_cond_signal时,它会唤醒等待在该条件变量上的一个线程(如果有线程正在等待)。如果有多个线程在等待,那么具体唤醒哪个线程是由系统调度策略决定的。

pthread_cond_wait函数

pthread_cond_wait函数用于使调用线程阻塞等待条件变量。在调用pthread_cond_wait之前,调用线程必须已经持有与该条件变量相关联的互斥锁。当调用pthread_cond_wait时,线程会自动释放其持有的互斥锁,并进入睡眠状态,等待条件变量被其他线程通过pthread_cond_signalpthread_cond_broadcast唤醒。一旦被唤醒,pthread_cond_wait函数会重新获取互斥锁,然后线程继续执行后续代码。

二、调用顺序分析

pthread_cond_signal调用完再调用pthread_cond_wait时,等待不会被解除。原因如下:

pthread_cond_signal的作用是唤醒等待在条件变量上的线程。如果在调用pthread_cond_signal时,没有线程在等待该条件变量,那么这个信号会被丢弃,不会产生任何效果。

当后续调用pthread_cond_wait时,它会将当前线程置于等待状态,等待条件变量被信号唤醒。由于之前的pthread_cond_signal调用没有对应的等待线程,所以这次的pthread_cond_wait调用会使线程一直处于等待状态,除非有其他线程再次调用pthread_cond_signalpthread_cond_broadcast来唤醒它。

三、示例代码说明

以下是一个简单的示例代码,用于演示这种情况:

#include <pthread.h>
#include <stdio.h>

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* thread_function(void* arg)
{
    pthread_mutex_lock(&mutex);
    // 模拟一些操作
	printf("Thread: doing some work...\n");
	// 发送信号,此时没有线程在等待
	pthread_cond_signal(&cond);
	// 然后尝试等待条件变量,这将导致线程一直等待
	printf("Thread: waiting for condition variable...\n");
	pthread_cond_wait(&cond, &mutex);
	printf("Thread: condition variable signaled (this will not be printed in this case)\n");
	pthread_mutex_unlock(&mutex);
	return NULL;
}

int main()
{
	pthread_t thread;	
	pthread_create(&thread, NULL, thread_function, NULL);
	// 主线程等待一段时间,确保子线程有机会执行
	sleep(2);
	pthread_join(thread, NULL);
	pthread_cond_destroy(&cond);
	pthread_mutex_destroy(&mutex);
	return 0;
}

在上述代码中,thread_function函数先调用pthread_cond_signal发送信号,此时没有线程在等待条件变量cond。接着调用pthread_cond_wait等待条件变量,由于之前的信号已经丢失,该线程将一直处于等待状态,printf("Thread: condition variable signaled (this will not be printed in this case)\n");这行代码不会被执行。

四、结论

综上所述,当pthread_cond_signal调用完再调用pthread_cond_wait时,调用pthread_cond_wait的线程不会被之前的pthread_cond_signal调用所唤醒,线程会一直处于等待状态,直到有其他线程再次对该条件变量发送信号或广播信号。在多线程编程中,正确处理pthread_cond_signalpthread_cond_wait的调用顺序是确保线程同步和正确运行的关键。

相关文章:

  • 一种简单有效的分析qnx+android智能座舱项目中的画面闪烁的方法(8155平台)
  • solidity之Foundry安装配置(一)
  • Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复
  • shell 脚本中的 sh 和 bash 是有区别的
  • Ollama Linux 部署指南
  • 国产开源PDF解析工具MinerU
  • 【鸿蒙开发】第四十章 Form Kit(卡片开发服务)
  • JavaScript系列(79)--Web Worker 高级应用
  • coco格式
  • Elasticsearch常用的查询条件
  • 记录一次 ALG 的处理过程
  • Ubuntu24.04LTS的下载安装超细图文教程(VMware虚拟机及正常安装)
  • 网络安全域管理 网络安全管理体系
  • python的多线程机制和构造
  • 代码随想录算法训练营第四十五天| 动态规划08
  • 大模型产品Deepseek(八)、数据嵌入+知识库管理+联网搜索,实现精准的知识查询
  • 为什么 MySQL 选择使用 B+ 树作为索引结构?MySQL 索引的最左前缀匹配原则是什么?MySQL 三层 B+ 树能存多少数据?
  • [OD E 100] 生成哈夫曼树
  • Java 字符串
  • 51c大模型~合集69
  • 河南一女子被医院强制带走治疗,官方通报:当值医生停职
  • 老字号“逆生长”,上海制造的出海“蜜”钥
  • 中国恒大披露清盘进展:要求债权人提交债权证明表
  • 湖北宜化拟斥资超32亿加价回购“弃子”,布局上游煤炭业务
  • 丹麦外交大臣拉斯穆森将访华
  • 江西贵溪:铜板上雕出的国潮美学