那么pthread_cond_timedwait()

void wait(int timeInMs) { struct timespec timeToWait; timeToWait.tv_sec = 5; timeToWait.tv_nsec = timeInMs*1000; int rt; pthread_mutex_lock(&fakeMutex); rt = pthread_cond_timedwait(&fakeCond, &fakeMutex, &timeToWait); pthread_mutex_unlock(&fakeMutex); } 

我正在使用此代码尝试让一个线程等待一段时间,但它根本不起作用。 没有错误,它只是不会使程序执行得更慢。

我想也许每个线程都需要拥有它自己的条件和互斥量,但这对我来说真的没有意义。

使用任何睡眠变体,都不能保证行为。 由于内核不知道不同的线程,所有线程也可以hibernate。

使用更安全,更清洁的解决方案是pthread_cond_timedwait 。 您错误地使用了API。 这是一个更好的例子:

 pthread_mutex_t fakeMutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t fakeCond = PTHREAD_COND_INITIALIZER; void mywait(int timeInMs) { struct timespec timeToWait; struct timeval now; int rt; gettimeofday(&now,NULL); timeToWait.tv_sec = now.tv_sec+5; timeToWait.tv_nsec = (now.tv_usec+1000UL*timeInMs)*1000UL; pthread_mutex_lock(&fakeMutex); rt = pthread_cond_timedwait(&fakeCond, &fakeMutex, &timeToWait); pthread_mutex_unlock(&fakeMutex); printf("\nDone\n"); } void* fun(void* arg) { printf("\nIn thread\n"); mywait(1000); } int main() { pthread_t thread; void *ret; pthread_create(&thread, NULL, fun, NULL); pthread_join(thread,&ret); } 

您需要指定从当前时间等待的时间。 因为你只告诉5秒和几纳秒,它发现时间已经过去并且没有等待……如果有任何疑问,请告诉我。

pthread_cond_timedwait函数占用绝对时间,而不是相对时间。 这需要你想要停止等待的时间,而不是你想等多久。

pthread_cond_timedwait使用绝对时间,因此需要:

  • 使用gettimeofday来检索当前时间。
  • timespec.tv_nsec是纳秒,它不能大于1秒。
  • timeval.tv_usec是微秒(1000纳秒)。
  • timeInMs是毫秒:1毫秒= 1000微秒= 1000 * 1000纳秒。

     void wait(int timeInMs) { struct timeval tv; struct timespec ts; gettimeofday(&tv, NULL); ts.tv_sec = time(NULL) + timeInMs / 1000; ts.tv_nsec = tv.tv_usec * 1000 + 1000 * 1000 * (timeInMs % 1000); ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000); ts.tv_nsec %= (1000 * 1000 * 1000); n = pthread_cond_timedwait(&condition, &mutex, &ts); if (n == 0) // TODO: singaled else if (n == ETIMEDOUT) // TODO: Time out. } 

考虑到你正在使用timespec,你的目标不是同步而是等待我建议nanosleep。

 #include  . . . struct timespec remain; remain.tv_sec = 5; remain.tv_nsec = timeInMs * 1000; do { if ( nanosleep( &remain, &remain ) == 0 || errno != EINTR ) { break; } } while ( 1 ); . . . 

该代码不会睡眠,它会检查条件一段时间。 因为你可能没有设置cond ok它只是立即返回。

如果您不愿意在信号周围同步线程,则pthread_cond _wait不是您需要的。 检查条件变量如何工作。

如果你想睡几秒精确使用睡眠

如果您想以微秒精度进行睡眠,请使用时间选择 。

这是一个示例,我从主循环创建了一个线程,它执行扫描目录并具有5秒的超时。 并且来自线程的信令使用全局的条件变量发生。 我们一直在检查来自线程的信号:

  pthread_cond_t C_KISU_SwagntUtilityBase::m_cond; /*Global variable*/ /*Inside main function*/ /*Local variables*/ pthread_condattr_t l_attr; pthread_condattr_init(&l_attr); pthread_condattr_setclock(&l_attr, CLOCK_MONOTONIC); pthread_cond_init(&C_KISU_SwagntUtilityBase::m_cond, &l_attr); Int32 l_threadid = pthread_create(&l_updatethread,NULL,C_KISU_SwagntUtilityBase::ThreadScanDirectoryByFilter,&l_filer); if(CMP_ZERO == l_threadid) { pthread_mutex_t l_mutex = PTHREAD_MUTEX_INITIALIZER; struct timespec l_ts; if (clock_gettime(CLOCK_MONOTONIC, &l_ts) == INIT_NEGONE) { /* Handle error */ } printf("\n Setting max time to run ThreadScanDirectoryByFilter as 5 second")); l_ts.tv_sec += l_filer.m_max_scan_time; if(l_filer.m_scan_status == 0) { pthread_mutex_lock(&l_mutex); int l_rt = pthread_cond_timedwait(&C_KISU_SwagntUtilityBase::m_cond, &l_mutex, &l_ts); if (ETIMEDOUT == l_rt) { printf("\n timeout has happened before scan routine could finish")); } else if (EOK == l_rt) { printf("\n Scan successful")); } else { printf("\n Unknown error while timeout condition check")); } pthread_mutex_unlock(&l_mutex); } } else { printf("\n Error while creating thread\n"); }