Получает ли pthread_cond_wait () мьютекс сразу после получения сигнала? - PullRequest
0 голосов
/ 30 марта 2019

У меня есть поток, 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 получает мьютекс после того, как ему было сообщено?

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Есть ли способ убедиться, что B получает мьютекс после того, как ему было сообщено?

Нет, такого способа нет - B будет конкурировать с другими потоками за владениемьютекс, как обычно.

Кроме того, как ожидать, что B автоматически получит мьютекс при получении сигнала, когда A владеет мьютексом в то время, когда он сигнализирует?

0 голосов
/ 01 апреля 2019

Итак, я преодолел эту проблему, используя семафор, который инициализирован на 1. Поток A выполняет операцию sem_wait() на семафоре, прежде чем заблокировать мьютекс lock. Поток B выполняет операцию sem_post() на семафоре, прежде чем освободить мьютекс lock.

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