pthread 汇总
非阻塞定时器通过信号量SIGUSR1和定时器实现1s的Linux posix定时器。#include stdio.h #include signal.h #include pthread.h #include unistd.h #include time.h #include sys/time.h timer_t timerid; // 全局定时器ID void* timer_thread(void* arg) { sigset_t set; /* 信号掩码集合 */ int sig; /* 接收的信号值 */ /* 初始化信号集 */ sigemptyset(set); sigaddset(set, SIGUSR1); /* 阻塞SIGUSR1信号确保同步处理 */ pthread_sigmask(SIG_BLOCK, set, NULL); /* 信号处理主循环 */ while (1) { if (sigwait(set, sig) 0 sig SIGUSR1) { printf([%ld] Timer task executed\n, time(NULL)); } } return NULL; } int main() { pthread_t tid; /* 定时器事件配置 */ struct sigevent sev { .sigev_notify SIGEV_SIGNAL, /* 信号通知方式 */ .sigev_signo SIGUSR1 /* 使用SIGUSR1信号 */ }; /* 定时器间隔设置(1秒周期) */ struct itimerspec its { .it_value {.tv_sec 1, .tv_nsec 0}, /* 首次触发延迟 */ .it_interval {.tv_sec 1, .tv_nsec 0} /* 周期间隔 */ }; /* 主线程信号屏蔽设置 */ sigset_t set; sigemptyset(set); sigaddset(set, SIGUSR1); pthread_sigmask(SIG_BLOCK, set, NULL); /* 创建单调时钟定时器 */ if (timer_create(CLOCK_MONOTONIC, sev, timerid) -1) { perror(timer_create failed); return -1; } /* 启动定时器 */ timer_settime(timerid, 0, its, NULL); /* 创建信号处理线程 */ if (pthread_create(tid, NULL, timer_thread, NULL) ! 0) { perror(pthread_create failed); return -1; } /* 主线程等待子线程结束 */ pthread_join(tid, NULL); /* 程序结束前清理定时器 */ timer_delete(timerid); return 0; }条件变量-阻塞唤醒1. 阻塞与非阻塞1.1 概念阻塞调用函数不立即返回线程挂起等待某个事件时间、数据、信号、条件变量等非阻塞调用无论有没有达到目标条件函数立刻返回不会挂起线程1.2 CPU占用误区 1“阻塞就一定会占 CPU”忙等待while (1);才占满 CPUsleep、cond_wait、read 阻塞、select 这种内核阻塞线程挂起无 CPU 消耗。2. 代码#include stdio.h #include stdlib.h #include pthread.h #include unistd.h // 互斥锁、条件变量动态初始化方式 pthread_mutex_t mutex; pthread_cond_t cond; // 共享条件 int ready 0; void *consumer_thread(void *arg) { pthread_mutex_lock(mutex); // while 避免虚假唤醒绝对不能用if while (ready 0) { printf(消费者条件不满足开始阻塞等待...\n); // 释放mutex阻塞被唤醒后重新持有锁 pthread_cond_wait(cond, mutex); } printf(消费者收到唤醒信号条件满足ready %d\n, ready); pthread_mutex_unlock(mutex); return NULL; } void *producer_thread(void *arg) { sleep(2); // 模拟耗时准备工作 pthread_mutex_lock(mutex); ready 1; printf(生产者条件已就绪发送唤醒信号\n); pthread_cond_signal(cond); // 唤醒一个等待线程 pthread_mutex_unlock(mutex); return NULL; } int main(void) { pthread_t tid_consumer, tid_producer; // 动态初始化 mutex condmutex_init cond_init if (pthread_mutex_init(mutex, NULL) ! 0) { perror(pthread_mutex_init fail); return -1; } if (pthread_cond_init(cond, NULL) ! 0) { perror(pthread_cond_init fail); pthread_mutex_destroy(mutex); return -1; } // 创建线程 pthread_create(tid_consumer, NULL, consumer_thread, NULL); pthread_create(tid_producer, NULL, producer_thread, NULL); // 等待线程结束 pthread_join(tid_consumer, NULL); pthread_join(tid_producer, NULL); // 销毁资源 pthread_mutex_destroy(mutex); pthread_cond_destroy(cond); printf(main: 程序退出\n); return 0; }1. while(ready 1){}防止虚假唤醒。操作系统允许无任何 signal 情况下线程从 cond_wait 苏醒这叫虚假唤醒 (spurious wakeup)。2./**消费者等待cond**/ pthread_mutex_lock(mutex); while (ready 0) { //释放锁 pthread_cond_wait(cond, mutex); //拿到锁 } pthread_mutex_unlock(mutex); /**生产者修改cond**/ pthread_mutex_lock(mutex); ready 1; pthread_cond_signal(cond); pthread_mutex_unlock(mutex);mutex主要为了保护ready公共态信号。如果没有mutex锁保护消费者线程如果判断ready0后还未到wait生产者把ready 1 修改并发送cond但是消费者线程为接收到则一直等待。如果有mutex保护消费者线程拿到锁ready0wait后释放锁生产者拿到锁修改ready状态发送信号量释放锁消费者拿到cond拿到锁释放锁。

相关新闻

关于芯片设计中后端的理解

关于芯片设计中后端的理解

1 芯片概述 做过电路板级设计的人都知道芯片的样子,如下图所示。这个是网上找的芯片的样子,这只是其中两种,左边的是直插的芯片,右边的是贴片的芯片。顾名思义直插就是芯片的管脚直接插在电路板上,贴片是将芯片的管脚…

2026/8/18 18:41:01 阅读更多 →
iPad 选购避坑指南,四款机型核心差异与真实场景匹配

iPad 选购避坑指南,四款机型核心差异与真实场景匹配

四款机型的核心定位:别为用不到的性能买单 面对 iPad 产品线,最让人头疼的往往不是“买不起”,而是“怕买错”。对于预算明确的学生党和职场新人来说,搞清楚四款机型的真实定位,比死磕参数表重要得多。 iPad Pro是纯粹…

2026/8/18 18:41:01 阅读更多 →
[项目编号:project53925]衣服不是一条库存记录:这个 Spring Boot 服装库存管理系统,毕设展示很有业务感

[项目编号:project53925]衣服不是一条库存记录:这个 Spring Boot 服装库存管理系统,毕设展示很有业务感

款式、库存、销售、统计都能讲清楚,比普通后台管理项目更容易做出展示层次。一件衣服,背后对应的不只是名称和库存数量。它可能还有颜色、尺码、面料、售价、成本、销量和库存状态。把这些信息管理清楚,项目就有了真正的业务感。很多库存系统…

2026/8/18 18:41:00 阅读更多 →

最新新闻

界面组件DevExpress ASP.NET Web Forms v22.2版本系统环境配置要求

界面组件DevExpress ASP.NET Web Forms v22.2版本系统环境配置要求

DevExpress ASP.NET Web Forms Controls拥有针对Web表单(包括报表)的110种UI控件,DevExpress ASP.NET MVC Extensions是服务器端MVC扩展或客户端控件,由轻量级JavaScript小部件提供支持的70个高性能DevExpress ASP.NET Core Contr…

2026/8/18 19:14:29 阅读更多 →
【2014-04-10】quitting can be productive sometimes

【2014-04-10】quitting can be productive sometimes

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。 发布时间: 2014-04-10 | 标题:quitting can be productive sometimes | 分类: 生活点滴 / 英语学习 &…

2026/8/18 19:14:29 阅读更多 →
sys.path 与 os.getcwd区分:代码运行中的路径问题

sys.path 与 os.getcwd区分:代码运行中的路径问题

获取当前工作目录 import sysprint(sys.path[0])获取执行命令的位置 import osprint(os.getcwd())python 代码运行路径问题 在下载使用别人的代码进行运行时,有时会遇到路径问题。将自己目前遇到的进行分类和总结。 主要分为两类: import相关open文件相关…

2026/8/18 19:14:29 阅读更多 →
@EnableRetry注解解读

@EnableRetry注解解读

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency> 前言 在分布式系统、微服务架构以及对外部服务&#xff08;如数据库、第三方API、消息队列&#xff09;的调用中&#xf…

2026/8/18 19:14:29 阅读更多 →
【2014-04-27】windows用户管理命令

【2014-04-27】windows用户管理命令

[历史归档] 本文原发布于 cstriker1407.info 个人博客&#xff0c;内容为历史存档&#xff0c;仅供参考。 发布时间&#xff1a; 2014-04-27 &#xff5c; 标题&#xff1a;windows用户管理命令 &#xff5c; 分类&#xff1a; 操作系统 / windows &#xff5c; 标签&…

2026/8/18 19:14:29 阅读更多 →
罗列几个提升WPF应用程序冷启动性能的方法!(Part 2)

罗列几个提升WPF应用程序冷启动性能的方法!(Part 2)

在上文中&#xff0c;我们主要介绍了针对三个技术的WPF应用程序性能提升&#xff0c;本文将着重介绍针对DevExpress WPF界面控件研发的应用程序如何提升性能&#xff01; 有用控件推荐~DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业…

2026/8/18 19:13:28 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图&#xff1a;用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手&#xff1a;7个字重免费商用&#xff0c;从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻&#xff1a;设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南&#xff1a;GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者&#xff0c;最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent&#xff0c;从本地部署到云端API&#xff0c;我们正处在一个技术栈快速重构的节点。然而&#xff0c;面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →