龙岗平湖网站建设公司,建设电子商务网站期末考试,培训方案模板,wordpress评论通知pthread 条件变量使用注意
使用 pthread_cond_timedwait 等待条件变量时#xff0c;其默认使用的为系统时间#xff0c;若在其等待期间修改系统时间#xff0c;则会导致其提前结束。
测试步骤 运行以下代码。 使用 date 命令查看系统时间#xff0c;假设输出为 Thu Jan …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.hpthread_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.hpthread_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;
}