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
-
示例代码如下:文章来源地址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模板网!