Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过pthread_cond_wait和pthread_cond_信号保证让步_C_Multithreading_Pthreads_Mutex_Condition Variable - Fatal编程技术网

通过pthread_cond_wait和pthread_cond_信号保证让步

通过pthread_cond_wait和pthread_cond_信号保证让步,c,multithreading,pthreads,mutex,condition-variable,C,Multithreading,Pthreads,Mutex,Condition Variable,假设我有一个具有3个POSIX线程的C程序,共享一个全局变量、互斥量和条件变量,其中两个正在执行以下psuedocode: ...process data... pthread_mutex_lock( &mutex ); variable = data_ptr; pthread_cond_signal( &cond ); pthread_mutex_unlock( &mutex ); 第三次跑步: while(1) { while( variable == NU

假设我有一个具有3个POSIX线程的C程序,共享一个全局变量、互斥量和条件变量,其中两个正在执行以下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\u mutex\u 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_信号将唤醒第三个线程,但它可能不会立即接收互斥。其他写入程序之一可能首先使用互斥锁。不过,您可以通过多做一点工作来实现您的目标:

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\u cond\u wait
手册页

未阻塞的线程应根据调度策略(如适用)争夺互斥锁,就像每个线程调用了
pthread\u mutex\u lock
()


不幸的是,据我所知,没有可用的调度策略可以为您提供所需的行为。

严格来说,单处理器系统上静态优先级高于写入线程的SCHED_FIFO或SCHED_RR可以工作。但在SMP上,您仍然可以竞争锁。