有没有办法等待代码,直到某些变量在C编程中重置或更改,如tcl中的vwait?
我们可以实现相同的示例代码:
这里使用线程,我们可以将变量getout设置为1并可以继续进行。 注意:由于代码中的一些问题,我不能使用无限循环来继续检查变量。同一个任务是否有某种触发器?提前谢谢。
#include <stdio.h>
#include <pthread.h>
int getout = 0;
void *threadfunc(void *parm)
{
int x = 0;
for (;;) {
x++;
if (x == 500000) {
getout = 1;
}
}
return NULL;
}
void main () {
pthread_t pth;
pthread_create(&pth,NULL,threadfunc,"foo");
// wait for getout to be set to 1;
pthread_cancel(pth); // cancel the thread after wait
}
答案 0 :(得分:3)
您所拥有的代码不能仅使用互斥/条件来完成,因为它们中的任何一个都会创建竞争条件或未定义的行为,但需要信号量。如果你想使用pthread原语,你最终会重新发明一个信号量。
#include <semaphore.h>
#include <stdio.h>
#include <pthread.h>
sem_t completed;
void *threadfunc(void *parm)
{
int x = 0;
for (;;) {
x++;
if (x == 500000) {
// increase the semaphore value
printf("Posting semaphore\n");
sem_post(&completed);
}
if (! (x % 50000)) {
printf("Yielding\n");
// must yield with cooperative threading
pthread_yield();
}
}
return NULL;
}
int main () {
pthread_t pth;
// 3rd parameter is value - we put in 0
if (sem_init(&completed, 0, 0)) {
printf("sem_init failed\n");
return 1;
}
pthread_create(&pth,NULL,threadfunc,"foo");
// wait for completed to be increased;
sem_wait(&completed);
printf("Wait completed\n");
pthread_cancel(pth); // cancel the thread after wait
sem_destroy(&completed);
}
答案 1 :(得分:2)
不,你需要实现自己的信号。
这通常是通过条件和互斥量来实现的:
#include <stdio.h>
#include <pthread.h>
int getout = 0;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *threadfunc(void *parm)
{
int x = 0;
for (;;)
{
x++;
if (x == 500000)
{
pthread_mutex_lock(&mutex);
getout = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
return NULL ;
}
int main(void)
{
pthread_t pth;
pthread_create(&pth, NULL, threadfunc, "foo");
pthread_mutex_lock(&mutex);
while (!getout)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
pthread_cancel(pth); // cancel the thread after wait
}
注意:为了便于阅读,此示例错过了系统调用的错误检查。