1

有什么方法可以等待代码,直到某些变量在 C 编程(如 tcl 中的 vwait)中被重置或更改?

我们可以实现相同的示例代码:

这里使用线程,我们可以将变量 getout 设置为 1 并可以继续进行。注意:由于代码中的一些问题,我不能使用无限 while 循环来继续检查变量。同一任务是否有某种触发器?提前致谢。

#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
}
4

2 回答 2

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);
}
于 2013-08-21T06:58:32.347 回答
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
}

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

于 2013-08-21T06:42:10.053 回答