c ++ 11 std :: mutex ошибка компилятора в Visual Studio 2012

Это квест о тупике в стандарте C ++ 11.

In the sec3.2.4 of C++ Concurrency in Action, there is an example for preventing multithreads from deadlock. For guys without this book, in addition, there is an another almost similar example you can refer to: http://en.cppreference.com/w/cpp/thread/lock_tag

Проблема, с которой я столкнулся, заключается в том, что коды обоих кодов возникают с ошибками компилятора в Visual Studio 2012. Сообщение об ошибке:

'std::mutex::mutex': cannot access private member declared in class 'std::mutex'

Эта проблема также возникает в следующем более простом коде, чем в cppreference.com:

struct bank_account {
    std::mutex m;
};
void transfer(bank_account &from, bank_account &to)
{
    std::lock(from.m, to.m);
}
int _tmain(int argc, _TCHAR* argv[])
{
    bank_account my_account;
    bank_account your_account;

    std::thread t1(transfer, my_account, your_account); //compiler-error!

    std::system("pause");
    return 0;
}

Любая идея решить эту проблему в Visual Studio 2012?

3
nl ja de
@Shepurin. Вы правы, у примера была ошибка. Я только что исправил это.
добавлено автор juanchopanza, источник
@cbel хороший улов. Исправлено это тоже. Думаю, кто бы ни опубликовал оригинал, он не тестировал его.
добавлено автор juanchopanza, источник
Должен ли это быть редким примером неправильного кода примера на Cppreference.com?
добавлено автор SChepurin, источник
@juanchopanza - Это было быстро и, наверное, исправить исправление).
добавлено автор SChepurin, источник
@juanchopanza - Теперь это работает - liveworkspace.org/code/2pBC6p$2 , Я также заметил, что некоторые образцы Cppreference.com, у которых нет поля «Выход», могут быть (могут быть) не протестированы из-за того, что компилятор не соответствует последнему стандарту.
добавлено автор SChepurin, источник
Другая неправильная вещь в этом примере кода - это объявление std :: lock_guard без создания экземпляра шаблона, то есть std :: lock_guard .
добавлено автор cbel, источник

3 ответы

mutexes are not copyable or assignable, and the std::thread constructor is attempting to make a copy. You can circumvent this by using an std::reference_wrapper via std::ref:

std::thread t1(transfer, std::ref(my_account), std::ref(your_account));

альтернативно, вы можете передать временные bank_accounts :

std::thread t1(transfer, bank_account(), bank_account());

Это скорее всего приведет к тому, что bank_accounts будет перемещен, а не скопирован, хотя также возможно, что копия будет устранена с помощью copy elision .

7
добавлено
Каким будет использование перевода денег между «временными банковскими счетами»? :-) Держу пари, что счет не копируется, или все будут богаты.
добавлено автор Bo Persson, источник
@BoPersson в эти дни, все банки являются временными, поэтому я так полагаю, что учетные записи, содержащиеся в нем :-) Я также слышал, что много денег можно сделать переходом между временными учетными записями.
добавлено автор juanchopanza, источник
Я понял, это работает! Большое спасибо, спасибо Джоахиму и Билзу!
добавлено автор cbel, источник

Вы делаете копию my_account и your_account на std :: thread , но std :: mutex не является ни копируемым, ни подвижным.

Попробуйте пройти по ссылке:

 std::thread t1(transfer, std::ref(my_account), std::ref(your_account));
1
добавлено

Из этой ссылки :

Класс mutex не копируется.

Мьютекс нельзя скопировать или переместить.

0
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest