1

tcl の vwait のように、C プログラミングで変数がリセットまたは変更されるまでコードを待機する方法はありますか?

同じことを実装できるサンプルコード:

ここでスレッドを使用して、変数 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 に答える