C ++ 11: Переменная Mutex & Condition не может быть скопирована - PullRequest
5 голосов
/ 19 мая 2019

Я новичок в C ++ 11 и использую многопоточность.Я сталкивался со сценарием, в котором невозможно скопировать объекты мьютекса и условных переменных.Код выглядит следующим образом ....

class producer {

   public: 
      producer(mutex m, condition_variable cv) 
      {
           mut = m;    // ERROR
           cvar = cv;   // ERROR
       }

    private:
         mutex mut;
         condition_variable cvar;
}

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

Есть ли способ преодолеть это?Я хочу получить класс продюсера и потребителя, а затем передать mutex & cv из функции main .

, поэтому в основном вызов из функции main должен выглядеть следующим образом: *

int main ()
{
    mutex m;
    condition_variable cv;
    //Initialize mutex & cv
    producer prod(m, cv);
}

Ответы [ 3 ]

2 голосов
/ 19 мая 2019

Нет, это невозможно.Функции были добавлены в C ++ для включения этой функции (без копирования).

Если вы думаете о реализации, вы меняете что-то в объекте ядра?Будет ли это то же самое.Возможно нет.Это по замыслу.

1 голос
/ 19 мая 2019

Это невозможно по замыслу.

Что означает копирование мьютекса?Что он должен делать?

Скажем, вы ожидаете мьютекс A, а некоторые тела копируют мьютекс A в мьютекс B. Вы все еще ждете A или B?или для них обоих?Нет. Вы все еще должны ждать A. Таким образом, другой мьютекс B не может быть копией A. Поэтому копирование удаляется.

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

Те же критерии выполняются для условных переменных.

Чтобы преодолеть эти проблемы, вы можете использовать указатели на взаимные исключения и условные переменные.Скажем, сохраните их как std::shared_ptr<std::mutex> и std::shared_ptr<std::condition_variable>, если вы хотите простой дизайн.

1 голос
/ 19 мая 2019

Вы хотите сохранить ссылки или указатели на mutex и condition_variable.

class producer {
public: 
  producer(mutex & m, condition_variable & cv) 
    : _mut{m}
    , _cvar{cv}
  {
  }

private:
     mutex & mut;
     condition_variable & cvar;
};

Вы можете использовать std::shared_ptr s, поскольку это позволяет вашим экземплярам иметь сильное владение mutex и condition_variable, но это быстрее набирать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...