1

如何在某个时间(以毫秒为单位)睡眠 posix pthread ?哪种方法最适合:使用 usleep 函数或 pthread_cond_timedwait。

4

1 回答 1

6

一个小故事

你住在旅馆里。你想在几个小时后醒来。如果您想在早上独自使用游泳池,您希望酒店经理仅在有重要事情(虚假唤醒pthread_cond_wait)或酒店游泳池是您的(互斥锁已锁定)时才醒来。

但如果你只是想在几个小时后醒来,你可以设置闹钟,当你醒来时,你检查一下闹钟是否响了,或者你可以再喝一个小时。你不关心其他资源,只关心时间是否过去。你干脆nanosleep()

等等,什么?

如果您只是想睡觉,请使用usleepor睡觉nanosleeppthread_cond_wait有开销,因为它在返回时锁定了一个互斥锁。如果该互斥锁在一段时间内不可用,那么如果另一个线程有问题或死锁,您的睡眠时间将比您最初想要的时间长,甚至永远。

话虽如此,如果您等待受互斥体保护的资源并希望在线程唤醒后立即获取互斥体,则应使用条件变量。

C++11

如果您使用 C++11,请尝试std::this_thread::sleep_for. 但是,不要将 C++11 线程数据结构(线程、互斥体、条件变量)与 POSIX 的数据结构混合。

于 2013-10-29T06:36:53.377 回答