pthread_cond_timedwait 修改系统时间竟会导致其提前结束
pthread 条件变量使用注意
- 使用
pthread_cond_timedwait等待条件变量时,其默认使用的为系统时间,若在其等待期间修改系统时间,则会导致其提前结束。
测试步骤
-
运行以下代码。
-
使用
date命令查看系统时间,假设输出为Thu Jan 1 08:01:53 AM CST 1970。 -
使用
date -s 08:03:53设置系统时间,程序会立刻退出,并打印wait timed out。#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <errno.h> #include <unistd.h>pthread_cond_t g_cond; pthread_mutex_t g_mutex;void* thread1_func(void* arg) {// 必须先获取互斥锁pthread_mutex_lock(&g_mutex);// 获取当前时间struct timespec ts;clock_gettime(CLOCK_REALTIME, &ts);// 设置等待时间为 100 秒ts.tv_sec += 100;// 等待条件变量被唤醒,或者等待时间超时printf("waiting cond signal\n");int ret = pthread_cond_timedwait(&g_cond, &g_mutex, &ts);if (ret == 0) {printf("get cond signaled\n");} else if (ret == ETIMEDOUT) {printf("wait timed out\n");} else {printf("wait failed\n");}// 解锁pthread_mutex_unlock(&g_mutex);return NULL; }int main() {pthread_cond_init(&g_cond, NULL);pthread_mutex_init(&g_mutex, NULL);// 创建线程pthread_t th1;pthread_create(&th1, NULL, thread1_func, NULL);// 等待线程结束pthread_join(th1, NULL);pthread_mutex_destroy(&g_mutex);pthread_cond_destroy(&g_cond);return 0; }
解决方案
-
初始化条件变量时,设置其使用稳定时钟即可。
-
示例代码如下:
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <errno.h> #include <unistd.h>pthread_cond_t g_cond; pthread_mutex_t g_mutex;void* thread1_func(void* arg) {// 必须先获取互斥锁pthread_mutex_lock(&g_mutex);// 获取当前时间struct timespec ts;// 此处与上文不同clock_gettime(CLOCK_MONOTONIC, &ts);// 设置等待时间为 100 秒ts.tv_sec += 100;// 等待条件变量被唤醒,或者等待时间超时printf("waiting cond signal\n");int ret = pthread_cond_timedwait(&g_cond, &g_mutex, &ts);if (ret == 0) {printf("get cond signaled\n");} else if (ret == ETIMEDOUT) {printf("wait timed out\n");} else {printf("wait failed\n");}// 解锁pthread_mutex_unlock(&g_mutex);return NULL; }int main() {pthread_condattr_t condattr;pthread_condattr_init(&condattr);// 设置使用稳定时钟pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);pthread_cond_init(&g_cond, &condattr);pthread_mutex_init(&g_mutex, NULL);// 创建线程pthread_t th1;pthread_create(&th1, NULL, thread1_func, NULL);// 等待线程结束pthread_join(th1, NULL);pthread_mutex_destroy(&g_mutex);pthread_cond_destroy(&g_cond);return 0; }
相关文章:
pthread_cond_timedwait 修改系统时间竟会导致其提前结束
pthread 条件变量使用注意 使用 pthread_cond_timedwait 等待条件变量时,其默认使用的为系统时间,若在其等待期间修改系统时间,则会导致其提前结束。 测试步骤 运行以下代码。 使用 date 命令查看系统时间,假设输出为 Thu Jan …...
Linux命令超详细
Linux基础命令 Linux的目录结构 /,根目录是最顶级的目录了Linux只有一个顶级目录:/路径描述的层次关系同样适用/来表示/home/itheima/a.txt,表示根目录下的home文件夹内有itheima文件夹,内有a.txt ls命令 功能:列出…...
物理机、虚拟机、容器
特征物理机虚拟机容器抽象级别物理硬件虚拟化的硬件和操作系统应用和依赖项(在相同操作系统内核上运行)隔离性高(每个物理机独立运行操作系统)高(每个虚拟机独立运行操作系统)适度(共享操作系统…...
CSS画三角形(三种方法)
使用CSS画一个三角形,想必部分同学都有一个小疑问,css怎么做三角形,让我为大家介绍一下吧! 第一种方法 div {width: 0;height: 0;border-style: solid;border-width: 50px;border-color: transparent transparent black transpa…...
(一)、ts 基础类型 及class类举例字符雨和实现vue的挂在#app
文章目录 前言环境执行依赖node.js一、基础数据类型二、任意类型三、接口和对象类型四、 数组类型五、函数重载六、类型断言断言联合类型交叉类型 七、内置对象-Promise基础对象DOM和BOMPromise ts化代码雨案例 八、Class类(派生类和抽象类)派生类 abstract抽象类 classClass简…...
C++对象的内存分布和虚函数表
Linux C/C 开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全) c中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数。 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。 2.静态数据成员被提取出来…...
小白怎么学习性能测试?一文7个知识点带你成功入门!
1.什么是性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负…...
Orcad属性过滤器的使用技巧
Orcad内置的属性过滤器可以完美的解决由于属性太多导致的不好整理的问题。下面简单介绍一下方法和过程。 1、打开过滤器 2、新建属于自己的过滤器 3、进行器件属性过滤及调整的顺序(注这时一定关闭ORCAD,来操作) 3.1 安装目录下找到\Cadenc…...
腾讯云向量数据库正式对外全量开放公测
11月1日,腾讯云对外宣布向量数据库正式全量开放公测,同时性能层面带来巨大提升。腾讯云数据库副总经理罗云表示,除了公测之外,腾讯云向量数据库单索引已经支持百亿级向量规模,支持百万级QPS毫秒级查询延迟,…...
Linux新建普通用户无法使用退格键与tab键
创建普通用户 useradd mulan passwd mulan 切换用户 su mulan 发现普通用户无法使用退格键与tab键,一直显示如图 如图,按退格键(Backspace)、删除键出现 ‘^H’ 符号,tab键也不能自动拼写 这是新用户下的普通bash配置都没有,从…...
【湘粤鄂车牌】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
华大-HC32L130F8UA 内存使用注意事项
1,概念 本系统包含一块 64K 字节( Byte )容量的 FLASH 存储器,共划分为 128 个页( Sector ),每个页( Sector ) 的容量为 512 字节( Byte )。 FLASH …...
怎样才知道一个单片机的性能到极限了?
怎样才知道一个单片机的性能到极限了? 就题主的问题,应该是想问CPU利用率的问题。可以看看Rt-thread中关于统计CPU利用率函数,其主要实现方式是在idle线程先关闭中断计数后,正常计数(可被其他线程打断),最近很多小伙伴…...
Android Studio的笔记--SerialPort串口通讯学习和使用
SerialPort串口通讯学习和使用 SerialPortandroid-serialport-api源码下载 Android-SerialPort-API源码下载readme版本 Android-SerialPort-Tool源码下载 Android-Serialport源码下载使用方法readme android中使用串口通信使用android-serialport-api方式第1种 链接第2种 导入S…...
MySQL 启动选项和字符集
1. 客户端和服务器 1.1 服务器程序 数据库实例:代表 MySQL 服务器程序的进程( mysqld 可执行文件) mysqld_safe:启动脚本,会间接调用 mysqld 并监控服务器运行状态。出现错误时可以帮助重启服务器程序,输…...
社区投稿|解码Big Vector,开启Sui超扩展性的新篇章
* 本文是来自Sui生态项目Typus团队的投稿,文中「我们」均指代该项目团队,转载时修改部分不准确的用词。 本研究报告介绍了Big Vector的概念,这是一种我们用于 Typus V2 的新数据结构,以缓解 Sui 上数组和动态字段(dynamic field)…...
Linux根目录下的目录结构及其作用详解
Linux根目录是文件系统的最顶层,它包含了一些子目录,每个子目录都有特定的功能和存储的文件。只有了解了各个文件的使用功能,才能更好的去使用Linux系统。希望通过下面这张图能够让你更加了解根目录下的各个目录的功能。...
源码和SaaS账号:租房与自建房的区别
在当今数字化时代,软件已成为企业运营的重要支撑。然而,对于许多中小企业来说,获取和运营软件的方式有两种:源码和SaaS账号。这两者有何区别呢?让我们用租房和自建房的比喻来解释。 价格比较 源码:购买源码…...
Docker容器设置为自动重启
有时Docker服务出现异常,或者服务器出现异常,需要重启Docker服务或者服务器; 如果希望有一部分基础的或者常用的容器,在服务或者服务器重启的时候,可以实现自动启动,仅需使用命令进行简单配置即可实现。 D…...
速卖通卖家如何通过自己搭建测评补单系统,提高产品权重和排名?
速卖通卖家如何给店铺增加权重和排名? 在竞争激烈的速卖通平台上,为自己的店铺增加权重是吸引更多买家和提升销售的关键。店铺的权重决定着在搜索排名、推荐位和广告展示方面的优先级。今天珑哥为您介绍一些有效的策略,帮助您提升速卖通店铺…...
Bypass Paywalls Clean完全使用指南:突破网络内容访问限制的开源方案
Bypass Paywalls Clean完全使用指南:突破网络内容访问限制的开源方案 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 当你急需查阅重要新闻却遭遇付费墙阻挡时,…...
计算机毕业设计springboot月知晓彩妆销售系统 SpringBoot美妆臻选在线商城系统 基于SpringBoot的“妆点人生“化妆品零售平台
计算机毕业设计springboot月知晓彩妆销售系统bq58y9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在颜值经济蓬勃发展的当下,化妆品电商市场持续高速增长。传统线下…...
经典蓝牙双机控制 APP-完整版1
经典蓝牙双机控制 APP-完整版1🎯 第一步:创建总开关(最重要) 文件:app/src/main/java/com/bt/BuildConfig.java package com.bt;/*** 条件编译开关* true 服务端(被控端 被控制的手机)* fals…...
如何使用 Flutter 开发 HarmonyOS 应用
文章目录为什么使用 Flutter 来开发?搭建 Flutter 开发环境mac 环境变量示例win 环境变量参考验证环境变量是否配置成功集成与调试 Flutter OH SDKFlutter 开发环境搭建第一个 Flutter OH 程序其它常用 Flutter OH 命令题外话Flutter OH 参考文档Author:…...
高德API+ECharts实战:5分钟搞定最新行政区划地图可视化(附乡镇级GeoJSON下载)
高德API与ECharts融合实战:行政区划地图极速可视化指南 当我们面对需要展示行政区划变动的需求时,往往会遇到数据过时、格式不兼容等问题。本文将手把手教你如何利用高德API和ECharts,在5分钟内构建一个支持乡镇级数据展示的动态地图可视化方…...
【TRO 26-cv-924】Canada Goose携手GBC重磅维权!超40名跨境卖家被诉,即将缺席审判!
导语:服饰、箱包类卖家紧急预警! 国际知名羽绒服品牌Canada Goose Inc.(加拿大鹅)发起新一轮商标维权风暴!案件号【26-cv-924】已在美国伊利诺伊州北区联邦法院正式立案。本次维权直指商标侵权与仿冒,超40家…...
如何快速打造专业音乐播放器:foobox-cn终极美化指南
如何快速打造专业音乐播放器:foobox-cn终极美化指南 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 还在为foobar2000单调的界面而烦恼吗?想要让专业音频播放器既强大又美观&a…...
QEMU跨架构神器:5分钟搞定Win10到银河麒麟的SSH端口映射
QEMU跨架构神器:5分钟搞定Win10到银河麒麟的SSH端口映射 在跨平台开发与测试中,如何在Windows主机上快速访问ARM架构虚拟机的SSH服务?传统网络配置往往需要复杂的桥接或NAT规则,而QEMU的hostfwd参数只需一行命令即可实现端口映射…...
工厂工艺管理进阶:SMT生产阶别如何实现精细化管控?
在电子制造领域,生产工艺的复杂性与精细化程度直接决定了产品的良率与交付能力。其中,表面贴装技术作为电子组装的核心环节,其管理粒度往往成为衡量工厂工艺管理水平的重要标尺。然而,在实际运营中,许多企业仍将SMT与其…...
APIPOST 8.x 脚本循环调用接口实战:从踩坑到完美解决OA流程压测问题
APIPOST 8.x 脚本循环调用接口实战:从踩坑到完美解决OA流程压测问题 最近在排查某OA系统偶发的流程异常时,需要模拟真实用户操作进行压力测试。原本考虑使用Jmeter,但环境配置较为复杂,于是尝试了国产工具APIPOST。没想到这次探索…...
