LINUX.ORG.RU

Нужен совет по С++ (vector + class + mutex + thread)

 , , , ,


1

4

Есть класс подключения разных устройств Device, в этом классе кроме прочих членов находиться std::mutex mlock;, так как объекты класса Device будут использоваться для работы в потоках. В начале программы я создаю Вектор объектов класса Device, «vector <Device> DeviceList(Config.GetDevAmount());» Здесь все работает как должно, вопросов нет, а вот дальше мне приходиться выполнять различные манипуляции с Вектором. Например, у меня в Векторе 10 объектов класса Device, в процессе работы мне нужно добавить еще 3 объекта класса Device после объекта с индексом 6, т.е., например, использовать модификатор insert. Но при использовании insert происходит копирование, а mutex копировать нельзя. push_back так же выполняет копирование, та же ситуация с resize. Может кто-то подсказать как правильно использовать mutex внутри объекта класса, чтобы можно было свободно работать с вектором?

Заранее благодарю за любой совет, так как сам уже несколько дней ломаю голову, а выхода не нашел. P.S. В операторе копирования в классе Device, попробовал создавать новый мютекс при копировании объектов. Если ручками написать Dev2 = Dev1, то все работает, а вот Вектор все равно ругает при компиляции и пока не выкинешь мютекс из класса - компилиться не хочет((((


Ответ на: комментарий от saifuluk

Ваш код мне более понятен и не кажется громоздким все по «Бритве Оккама», на мой взгляд

VladV
() автор топика
Ответ на: комментарий от VladV

но мне кажется, что ваш код слишком избыточен для мой задачи

Дык я этот код писал по просьбе одного местного больного, а не как демонстрацию решения вашей задачи. Тем более, что смысл вашей задачи для мене остался непонятным. Это что-то учебное?

eao197 ★★★★★
()
Ответ на: комментарий от ox55ff

может кто-то привести пример с вектором умных указателей на объекты класса Device? Например std::shared_ptr, как будет выглядеть создание такого вектора? Сейчас я делаю так: std::vector <Device> DeviceList(Config.GetDevAmount()); - GetDevAmount возвращает кол-во устройств оно размерность вектора, как это будет выглядеть если использовать shared_ptr, что-то не могу понять. Спасибо!

VladV
() автор топика
Ответ на: комментарий от VladV

Сейчас я делаю так: std::vector <Device> DeviceList(Config.GetDevAmount()); - GetDevAmount возвращает кол-во устройств оно размерность вектора, как это будет выглядеть если использовать shared_ptr,

Например:

std::vector<std::shared_ptr<Device>> DeviceList;
const auto DeviceCount = Config.GetDevAmount();
DeviceList.reserve(DeviceCount);
std::generate_n(std::back_inserter(DeviceList), DeviceCount,
  []{ return std::make_shared<Device>(); });

что-то не могу понять.

Вам бы это, подучиться бы надо.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Спасибо!

Вам бы это, подучиться бы надо.

Так я этим и занимаюсь)) Программы пишу исключительно для себя и для обучения. Просто так легче писать и учиться когда есть какой-то проект, ну для меня так

VladV
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.