代码之家  ›  专栏  ›  技术社区  ›  Edward

使用pthread_cond_wait和pthread_cond_signal保证产量

  •  2
  • Edward  · 技术社区  · 16 年前

    假设我有一个C程序,有3个POSIX线程,共享一个全局变量、互斥体和条件变量,其中两个正在执行以下伪代码:

    ...process data...
    pthread_mutex_lock( &mutex );
    variable = data_ptr;
    pthread_cond_signal( &cond );
    pthread_mutex_unlock( &mutex );
    

    while(1) {
        while( variable == NULL ) {
            pthread_mutex_wait( &cond, &mutex );
        }
        printf( "Data is %d", *variable );
    }
    

    3 回复  |  直到 16 年前
        1
  •  12
  •   bdonlan    16 年前

    pthread_mutex_lock(&mutex);
    /* ... */
    while (1) {
      while (variable == NULL)
        pthread_cond_wait(&cond, &mutex);
      printf("Data is %d", *variable);
    }
    /* ... */
    pthread_mutex_unlock(&mutex);
    

    void put(int *p) {
      pthread_mutex_lock(&mutex);
      while (variable)
        pthread_cond_wait(&cond_empty, &mutex);
      variable = p;
      pthread_cond_signal(&cond_full);
      pthread_mutex_unlock(&mutex);
    }
    
    int *get() {
      int *ret;
    
      pthread_mutex_lock(&mutex);
      while (!variable)
        pthread_cond_wait(&cond_full, &mutex);
      ret = variable;
      variable = NULL;
      pthread_cond_signal(&cond_empty);
      pthread_mutex_unlock(&mutex);
    
      return ret;
    }
    

        2
  •  1
  •   Bastien Léonard    16 年前

    standard :

    4.13调度策略

    • 当一个进程或线程是阻塞线程,并且它变成了可运行线程时

    所以它显然没有定义。这并不奇怪:一般来说,你不能假设哪个可运行线程会被调度运行。

        3
  •  0
  •   Tyler McHenry    16 年前

    根据 pthread_cond_wait 手册页

    pthread_mutex_lock ().