Повышение межпроцессных мьютексов и условных переменных - PullRequest
0 голосов
/ 25 апреля 2018

Я смотрю на этот пример кода Boost для двух процессов, совместно использующих мьютекс и условную переменную между ними:

https://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/synchronization_mechanisms.html

но я не понимаю, как здесь может работать конструкция переменных условия мьютекса.

Первоначальные вызовы процесса:

for(int i = 0; i < NumMsg; ++i){
     scoped_lock<interprocess_mutex> lock(data->mutex);    // Take mutex
     if(data->message_in){
        data->cond_full.wait(lock);                        // Wait
     }
     if(i == (NumMsg-1))
        std::sprintf(data->items, "%s", "last message");
     else
        std::sprintf(data->items, "%s_%d", "my_trace", i);

     //Notify to the other process that there is a message
     data->cond_empty.notify_one();                        // Notify

     //Mark message buffer as full
     data->message_in = true;
  }

и второй процесс вызывает:

  bool end_loop = false;
  do{
     scoped_lock<interprocess_mutex> lock(data->mutex);     // Take mutex
     if(!data->message_in){
        data->cond_empty.wait(lock);                        // Wait
     }
     if(std::strcmp(data->items, "last message") == 0){
        end_loop = true;
     }
     else{
        //Print the message
        std::cout << data->items << std::endl;
        //Notify the other process that the buffer is empty
        data->message_in = false;
        data->cond_full.notify_one();                       // Notify         
     }
  }
  while(!end_loop);

Для вызова wait() или notify() любой процесс должен содержать общий мьютекс, поэтому, если один процесс включен wait(), другой, безусловно, не может вызвать notify()?

1 Ответ

0 голосов
/ 25 апреля 2018

wait освобождает мьютекс во время ожидания, поэтому другой поток может получить мьютекс и выполнить уведомление.Также смотрите описание на https://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.conditions.conditions_whats_a_condition.

...