使用互斥锁控制while循环的时间

时间:2018-07-11 15:54:44

标签: c while-loop pthreads iteration mutex

我想了解如何使用线程来控制循环内指令的执行。我不能为此目的在main函数中使用sleep,因为那会阻塞主线程一段时间。相反,我只是想确保如果还没有经过一定的时间,则不会到达while循环的下一个迭代。当前,我有另一个线程仅启用了一个名为go_on的标志。

它可以工作,但是有没有办法用互斥锁来做到这一点?

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *thread_proc(void *arg)
{
    int *go_on = (int *)arg;
    while(1)
    {
        sleep(1);
        *(go_on) = 1;
    }
}

int main()
{
    int go_on = 0;

    pthread_t tid;
    pthread_create(&tid, NULL, &thread_proc, (void *)&go_on);

    int counter = 0;    
    while(1)
    {
        while(go_on == 0){};
        go_on = 0;
        counter += 1;
        printf("%d\n", counter);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您可以使用信号在线程之间进行通信。

使用条件和被调用线程锁定的互斥锁来阻塞第一个线程。然后,第二个线程发送信号以解除对该条件所阻塞的线程的阻塞。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>

pthread_cond_t cv;
pthread_mutex_t lock;

void *thread2(void *arg)
{
    //Send signal
    pthread_cond_signal(&cv);
}

int main()
{
    //Create thread2
    pthread_t threadId;
    pthread_create(&threadId, NULL, &thread2, NULL);

    //Lock the mutex
    pthread_mutex_lock(&lock);

    //Block the thread on a condition with the locked mutex
    pthread_cond_wait(&cv, &lock);

    printf("The thread is now unblocked");

    //Unlock the mutex
    pthread_mutex_unlock(&lock);

    return 0;
}

答案 1 :(得分:0)

根据MasterRem的回答,如果您想计时一个动作,可以执行以下操作,并使用while循环重复执行此操作。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>

pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock;

void *thread2(void *arg)
{
    while(1) {
        sleep(1);
        //Send signal
        pthread_cond_signal(&cv);
    }
}

int main()
{
    //Create thread2
    pthread_t threadId;
    pthread_create(&threadId, NULL, &thread2, NULL);

    //Lock the mutex
    pthread_mutex_init(&lock, NULL);
    pthread_mutex_lock(&lock);

    int counter = 0;

    while(1) {
        //Block the thread on a condition with the locked mutex
        pthread_cond_wait(&cv, &lock);
        counter += 1;
        printf("%d\n", counter);
    }

    //Unlock the mutex
    pthread_mutex_unlock(&lock);

    return 0;
}