pthread_cond_wait() 是否在收到信号后立即获取互斥量?

Does pthread_cond_wait() acquire the mutex immediately after being signalled?

我有一个线程 A,其功能在一个循环中运行,执行某项操作并唤醒另一个线程 B。然后它释放互斥锁并继续下一次迭代。线程 B 等待直到收到信号,然后做一些事情。我的问题是,在循环的下一次迭代中,是否保证 B 将在收到信号后获取互斥锁,或者线程 A 是否可以在 B 之前重新获取互斥锁?

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t signal = PTHREAD_COND_INITIALIZER;

int condition=0;

//function for thread A
void func_A(void *arg){
    while(1) {
      pthread_mutex_lock(&lock);
      do_something();
      condition=1;
      pthread_cond_signal(&signal);
      pthread_mutex_unlock(&lock);
    }
}

//function for thread B
void func_B(void *arg) {
    while(1) {
      pthread_mutex_lock(&lock);
      while(condition = 0)
        pthread_cond_wait(&signal, &lock);
      do_something_else();
      condition=0;
      pthread_mutex_unlock(&lock);
    }
}

有没有办法确保 B 在收到信号后获取互斥量?

Is there a way to make sure B acquires the mutex after it is signalled?

不,没有这样的方式 - B 将像往常一样与其他线程竞争拥有互斥量。

此外,当 A 在发信号时拥有互斥锁时,如何期望 B 在收到信号时自动获取互斥锁?

因此,我通过使用初始化为 1 的信号量克服了这个问题。线程 A 在锁定互斥量 lock 之前对信号量执行 sem_wait() 操作。线程 B 在释放互斥量 lock.

之前对信号量执行 sem_post() 操作
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t signal = PTHREAD_COND_INITIALIZER;

sem_t my_sem; //properly initialized with value set to 1

int condition=0;

//function for thread A
void func_A(void *arg){
    while(1) {
      sem_wait(&my_sem);  //notice the change
      pthread_mutex_lock(&lock);
      do_something();
      condition=1;
      pthread_cond_signal(&signal);
      pthread_mutex_unlock(&lock);
    }
}

//function for thread B
void func_B(void *arg) {
    while(1) {
      pthread_mutex_lock(&lock);
      while(condition = 0)
        pthread_cond_wait(&signal, &lock);
      do_something_else();
      condition=0;
      sem_post(&my_sem);  //notice the change
      pthread_mutex_unlock(&lock);
    }
}