大家好,又见面了,我是你们的朋友全栈君。
以前很喜欢用sleep和usleep函数来做定时器。确实方便啊。但是昨天在公司用这个函数写了个东西,被说这2个函数最好别在多线程里面使用。然后叫我改一个定时器方案。查看了man文档。发现sleep还真有问题。里面就写得有BUG:
BUGS sleep() may be implemented using SIGALRM; mixing calls to alarm() and sleep() is a bad idea. Using longjmp() from a signal handler or modifying the handling of SIGALRM while sleeping will cause undefined results.
说到了用sleep在多线程的不适合。因为是用的信号驱动来实现的。可能要引起不确定的因素。后来去网上找了下其他的方法,这里把方法贴出来。一个在多线程中比较好的实现是利用的pthread库里面的pthread_cond_timewait()函数来实现。下面贴出来代码。都比较基础。
1 void thread_sleep(int second) 2 { 3 /* time wait */ 4 struct timespec outtime; 5 pthread_cond_t cond; 6 pthread_mutex_t mutex; 7 8 /* timer init */ 9 pthread_mutex_init(&mutex, NULL); 10 pthread_cond_init(&cond, NULL); 11 12 pthread_mutex_lock(&mutex); 13 outtime.tv_sec = time(NULL) + second; 14 outtime.tv_nsec = 0; 15 pthread_cond_timedwait(&cond, &mutex, &outtime); 16 pthread_mutex_unlock(&mutex); 17 }
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155007.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...