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);
}
我用这段代码试图让一个线程等待一段时间,但它根本不起作用。没有错误,它只是不会让程序执行得更慢。
我在想也许每个线程都需要有自己的条件和互斥量,但这对我来说真的没有意义。
最佳答案
使用任何形式的睡眠,都不能保证行为。所有线程也可以睡眠,因为内核不知道不同的线程。
使用更安全、更清洁的解决方案是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秒和一些纳米秒,它发现时间已经过去,没有等待…请让我知道,如果有任何疑问。
关于c - pthread_cond_timedwait(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54305775/