就像tcl的vwait一样,C编程中有什么东西吗?

时间:2013-08-21 06:40:00

标签: c multithreading

有没有办法等待代码,直到某些变量在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
}

2 个答案:

答案 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
}

注意:为了便于阅读,此示例错过了系统调用的错误检查。