pthread_cond_timedwait 修改系统时间竟会导致其提前结束

这篇具有很好参考价值的文章主要介绍了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;
    }
    

解决方案

  • 初始化条件变量时,设置其使用稳定时钟即可。

  • 示例代码如下:文章来源地址https://www.toymoban.com/news/detail-736705.html

    #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 修改系统时间竟会导致其提前结束的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu 系统如何修改时间

    参考文章: 三种方法修改Ubuntu系统的时间 在Ubuntu上,你可以使用以下三种方法来修改时间:date命令,timedatectl命令和hwclock命令。 使用date命令: 打开终端。 输入以下命令来修改日期和时间: 其中,YYYY表示年份,MM表示月份,DD表示日期,HH表示小时,MM表示分钟,SS表示秒钟

    2024年02月14日
    浏览(44)
  • Linux - 查看、修改、更新系统时间

    本文以 CentOS 为例,演示如何查看、设置系统时间,以及自动从互联网更新系统时间。 1,查看系统时间 执行 date 命令可以查看当前系统的时间: 2,手动修改系统时间 (1)执行如下命令可以设置一个新的系统时间: (2)设置完后还要执行如下命令保存一下设置: (3)当然

    2024年02月11日
    浏览(34)
  • Android 修改系统息屏时间.

    本篇文章主要记录下android 如何修改手机息屏时间. 目前手机屏幕超时的时间范围一般是: 那如何设置超过30分钟呢? 代码很简单,如下: 获取屏幕超时时间: 直接运行的话会提示错误: java.lang.SecurityException: com.test.webtest was not granted this permission: android.permission.WRITE_SETTINGS. 我们先声

    2024年03月09日
    浏览(34)
  • centos 系统下查看时间时区以及修改

    1.1查看系统时间 1.2将系统日期修改为2014-7-2 : 1.3系统时间设置为 上午10:20 1.4系统时区修改 1.4.1查看系统时区 1.4.2修改时区(将上海改为系统时区) 提示是否要覆盖,输入y 确定 在Centos 7 中引入了一个叫 timedatectl 的设置设置程序.用法很简单: 2.1将硬件时钟调整为与本地时钟

    2024年02月11日
    浏览(51)
  • Linux 修改系统时间的两种方式?

    在Linux系统中,有两种常见的方式可以修改系统时间:使用date命令和通过修改时区文件。 方式一:使用date命令 打开终端。 以root或具有管理员权限的用户身份执行以下命令来修改系统时间: 将\\\"YYYY-MM-DD HH:MM:SS\\\"替换为您想要设置的新时间。例如,要将系统时间设置为2023年6月

    2024年02月09日
    浏览(39)
  • Linux 修改系统时间的两种方式

    通过相关工具来手动修改系统的时间。 使用NTP自动同步系统时间。 作用:显示和设置系统时间 选项: 时间格式: 例如:显示年月日时分秒 只修改年月日: 只修改时分秒: 全部都改: 说明: 使用date命令修改的时间是 临时生效 的,重启系统后失效,需要将当前时间和硬件

    2024年02月03日
    浏览(38)
  • adb shell date 修改系统时间和时区

    Pacific/Midway为设置的时区

    2024年02月11日
    浏览(59)
  • adb shell date 命令修改Android系统时间

    1.关掉自动时间同步 settings put global auto_time 0 2.关掉自动时区同步 settings put global auto_time_zone 0 3.挂载 adb remount 4.adb shell date “时间格式”    日期格式为 yyyymmdd.hhmmss 或者是 yyyy-mm-dd hh:mm:ss adb shell date \\\"2023-12-05 10:00:00\\\" 5.查看时间是否设置成功 adb shell date 6.设置时区。先将自动

    2024年02月01日
    浏览(49)
  • 偷偷告诉你Linux 修改系统时间的两种方式

    1、手动修改 通过相关工具来手动修改系统的时间。 2、自动同步 使用NTP自动同步系统时间。 1、date工具 作用:显示和设置系统时间 选项: 时间格式: 例如:显示年月日时分秒 只修改年月日: 只修改时分秒: 全部都改: 说明: 使用date命令修改的时间是 临时生效 的,重

    2024年02月09日
    浏览(40)
  • win10系统电脑修改注册表设置自动锁屏时间

    描述:win10系统笔记本电脑修改注册表设置自动锁屏时间的方法 步骤:     win键+r,输入regedit进入注册表界面       注册表界面按照路径 直接复制粘贴到下面的输入框中HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem          空白处右键新建 DWORD(32位)值,命

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包