Russian Qt Forum
Ноябрь 22, 2024, 17:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Контейнер std::mutex  (Прочитано 6999 раз)
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« : Февраль 14, 2017, 15:50 »

Здравствуйте
Я пробую сделать контейнер из mutex, к примеру vector.
Делаю так:

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

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

Можете подсказать, как сделать список mutex, если это возможно?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Февраль 14, 2017, 16:17 »

Нельзя копировать этот тип (std::mutex).
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Февраль 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>());
« Последнее редактирование: Февраль 14, 2017, 16:24 от __Heaven__ » Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #3 : Февраль 14, 2017, 16:22 »

А в первой строчке не опечатки? У меня пишет "expected nested-name-specifier before 'MutexPtr'", и еще 3 ошибки
Может еще нужно что-то перед этим подключить?
« Последнее редактирование: Февраль 14, 2017, 16:46 от YvenTitan » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Февраль 14, 2017, 16:36 »

Чёт я ерунду постом выше написал, кажись.
Возможно это будет накладно, а возможно и не сработает. Не разбирался глубоко в поточности и мьютексах. Но смысл в том, что чистые мьютексы в контейнерах вы не похраните.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #5 : Февраль 14, 2017, 17:38 »

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;
}
 
Записан

Пока сам не сделаешь...
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #6 : Февраль 14, 2017, 20:00 »

а ради интереса - зачем контейнер мутексов ?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Февраль 14, 2017, 23:32 »

тоже заинтересовало.
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #8 : Февраль 15, 2017, 09:49 »

Сейчас подумал... Наверно, можно и без него обойтись)
Я пишу серверную часть, к которой подключается несколько клиентов. Для каждого клиента 2 потока на сервер. части, которые используют один и тот же сокет (может можно 2 сокета для этих дел завести). Для каждого клиента один мьютекс, и в итоге получается контейнер мьютексов
Записан
cuntroll
Гость
« Ответ #9 : Февраль 17, 2017, 09:24 »

Для каждого клиента 2 потока на сервер.
WTF??? В замешательстве Это вообще как? Строит глазки
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Февраль 17, 2017, 12:10 »

Ну затея явно нездоровая, обычно за каждым мутексом нужен глаз да глаз, а Вы их пачками... Ну если "так надо" то никто не мешает создать контейнер указателей на мутексы, придется потратится на qDeleteAll при его удалении. Напр
Код
C++ (Qt)
std::vector<std::mutex *> band;
band.push_back(new std::mutex);
...
qDeleteAll(band);
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.203 секунд. Запросов: 23.