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/

10-11 20:50