假设我有一C节目3POSIX threads,共享全球变量,锁,并且情况变量,其中两个是执行以下psuedocode:

...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 );
}

它是安全的假设,第三线将会看到的数据从各第一二?

把不同的方式,如果一个线瓦亭上一个互斥和条件的变量,它是安全的假设,这将是下一个获得锁,如果它发出信号,而不是其他一些线,可能要等上的锁?

有帮助吗?

解决方案

有作为pthread_mutex_wait没有这样的事情。我假设你的意思是:

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

没有一种机制保障第三线程将看到从两个数据。调用pthread_cond_signal将唤醒第三个线程,但它可能不会立即采取互斥。一个接一个作家可以先取互斥。然而,你可以acheive你想要的东西多一点的工作:

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;
}

通过明确地等待要读出的变量,我们避免潜在的竞争状态。

其他提示

这里是我发现了什么在 标准:

4.13调度的政策

调度的政策影响的过程或线订购:

[...]

  • 当一个进程或螺纹是一个封锁线,它成为一个可运行的螺纹

符合实现中应规定的方式在其每个计划策略的可能修改的优先事项或另外影响的排序流程或螺纹在每次出现上文所列。此外,符合实现中应规定在其他什么情况下和以何种方式,每个调度的政策可能会修改的优先事项或影响的排序流程或螺纹。

所以它显然是不确定的。这不令人惊讶的:一般来说,你可以不承担任何有关其运线会预定的运行。

按照pthread_cond_wait手册页

  

这是畅通应当根据调度策略(如果适用的话),用于互斥抗衡线程(多个),并如同每个都称为pthread_mutex_lock()。

不幸的是,据我所知,有是给你你想要的行为没有可用的调度策略。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top