- 論壇徽章:
- 0
|
在網(wǎng)上(http://www.itwenku.com/linux/3/11923.htm)看到一個帖子,說是使用pthread_cond_timedwait使線程睡眠,不能精確到微秒級別,只能精確到秒。
引用原帖中內容:
“我設置了下面的值:
ts.tv_sec = time(NULL);
ts.tv_nsec=1000;
然后把子線程中的usleep都去掉,可超時就是不起作用?就是把ts.tv_nsec的值設成1000000也一樣沒用,郁悶”。
給個參考代碼(msec是毫秒,如果要做成微秒級別,修改一下就行了),以防還有兄弟犯類似錯誤,呵呵:
void sleep_thread(int msec)
{
struct timespec wake;
struct timeval now;
int nsec;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
gettimeofday(&now, NULL);
nsec = now.tv_usec * 1000 + (msec % 1000) * 1000000;
wake.tv_sec = now.tv_sec + msec / 1000 + nsec / 1000000000;
//如果把上面的兩句替換成下面的兩句,就是實現(xiàn)微秒級別睡眠
//nsec = now.tv_usec * 1000 + (msec % 1000000) * 1000;
//wake.tv_sec = now.tv_sec + msec / 1000000 + nsec / 1000000000;
wake.tv_nsec = nsec % 1000000000;
pthread_mutex_lock(&mutex);
pthread_cond_timedwait(&cond, &mutex, &wake);
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
}
順便說一下,其實使線程睡眠沒必要那么復雜,用sleep, usleep就行(在Linux上,它們是使線程睡眠,Unix上怎樣實現(xiàn)的,我沒驗證過)。要跨平臺,用一些跨平臺類庫如APR的apr_sleep就搞定了。 |
|