Russian Qt Forum

Программирование => С/C++ => Тема начата: YvenTitan от Февраль 14, 2017, 15:50



Название: Контейнер std::mutex
Отправлено: YvenTitan от Февраль 14, 2017, 15:50
Здравствуйте
Я пробую сделать контейнер из mutex, к примеру vector.
Делаю так:

std::mutex myMutex;
myVector.push_back(myMutex);

В результате пишет несколько ошибок, см. вложение

Можете подсказать, как сделать список mutex, если это возможно?


Название: Re: Контейнер std::mutex
Отправлено: __Heaven__ от Февраль 14, 2017, 16:17
Нельзя копировать этот тип (std::mutex).


Название: Re: Контейнер std::mutex
Отправлено: __Heaven__ от Февраль 14, 2017, 16:20
Зато можно сделать вектор указателей на мютексы
Код
C++ (Qt)
using MutexPtr = std::shared_ptr<std::mutex>;
std::vector<MutexPtr> vec;
vec.push_back(std::make_shared<std::mutex>());


Название: Re: Контейнер std::mutex
Отправлено: YvenTitan от Февраль 14, 2017, 16:22
А в первой строчке не опечатки? У меня пишет "expected nested-name-specifier before 'MutexPtr'", и еще 3 ошибки
Может еще нужно что-то перед этим подключить?


Название: Re: Контейнер std::mutex
Отправлено: __Heaven__ от Февраль 14, 2017, 16:36
Чёт я ерунду постом выше написал, кажись.
Возможно это будет накладно, а возможно и не сработает. Не разбирался глубоко в поточности и мьютексах. Но смысл в том, что чистые мьютексы в контейнерах вы не похраните.


Название: Re: Контейнер std::mutex
Отправлено: ViTech от Февраль 14, 2017, 17:38
mutex::mutex() (http://www.cplusplus.com/reference/mutex/mutex/mutex/):
Цитировать
mutex objects cannot be copied/moved (both the copy constructor and assignment operator are deleted for this type).

Можно так попробовать:
Код
C++ (Qt)
#include <vector>
#include <mutex>
#include <memory>
#include <iostream>
 
int main()
{
   using namespace std;
 
   using UniqueMutex = unique_ptr< mutex >;
   UniqueMutex unique_mutex = make_unique< mutex >();
 
   vector< UniqueMutex > my_vector;
   my_vector.push_back( std::move( unique_mutex ) );
   my_vector.push_back( make_unique< mutex >() );
 
   for ( size_t i = 0; i < my_vector.size(); ++i )
       cout << "mutex[" << i << "].try_lock = "
            << boolalpha << my_vector[i]->try_lock()
            << endl;
 
   return 0;
}
 


Название: Re: Контейнер std::mutex
Отправлено: qate от Февраль 14, 2017, 20:00
а ради интереса - зачем контейнер мутексов ?


Название: Re: Контейнер std::mutex
Отправлено: __Heaven__ от Февраль 14, 2017, 23:32
тоже заинтересовало.


Название: Re: Контейнер std::mutex
Отправлено: YvenTitan от Февраль 15, 2017, 09:49
Сейчас подумал... Наверно, можно и без него обойтись)
Я пишу серверную часть, к которой подключается несколько клиентов. Для каждого клиента 2 потока на сервер. части, которые используют один и тот же сокет (может можно 2 сокета для этих дел завести). Для каждого клиента один мьютекс, и в итоге получается контейнер мьютексов


Название: Re: Контейнер std::mutex
Отправлено: cuntroll от Февраль 17, 2017, 09:24
Для каждого клиента 2 потока на сервер.
WTF??? :-\ Это вообще как? ::)


Название: Re: Контейнер std::mutex
Отправлено: Igors от Февраль 17, 2017, 12:10
Ну затея явно нездоровая, обычно за каждым мутексом нужен глаз да глаз, а Вы их пачками... Ну если "так надо" то никто не мешает создать контейнер указателей на мутексы, придется потратится на qDeleteAll при его удалении. Напр
Код
C++ (Qt)
std::vector<std::mutex *> band;
band.push_back(new std::mutex);
...
qDeleteAll(band);