我想了解如何使用线程来控制循环内指令的执行。我不能为此目的在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;
}
答案 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;
}