std::vector из std::mutex. Как реализовать

127
01 декабря 2020, 21:00

Нужно сделать вектор со структурой, содержащей вектор из структур, содержащих мьютекс.

Кусок кода, отвечающий за работу с мьютексом

struct CommandQueue_leaf {
    struct MyMessen mes;
    unsigned char status;
};

struct MutexList {
    std::string text;
    std::mutex mutex;
};

struct CommandQueue {
    std::vector<struct CommandQueue_leaf> mes;
    std::vector<struct MutexList> UsedFiles;
};

...

// Главный цикл  

struct CommandQueue* cm...
struct MutexList* res = (struct MutexList*)malloc(sizeof * res);
res->text = str;
cm->UsedFiles.push_back(*res);
free(res);
...
// В потоках
cm->UsedFiles[mutexnum].mutex.lock();
cm->UsedFiles[mutexnum].mutex.unlock();

...
// Главный цикл   
//Очистка
cm->mes.clear();
cm->UsedFiles.clear();

При компиляции пишет:

Ошибка C2280: "MutexList::MutexList(const MutexList &)": предпринята попытка ссылки на удаленную функцию Server

Answer 1

Мьютекс невозможно ни скопировать, ни даже перенести. Поэтому вам надо использовать какой-нибудь перемещаемых контейнер для мьютекса, например std::unique_ptr, и переносить его через std::move. И да, забудьте про malloc - вызовов этой функции в плюсовом коде быть не должно. В данном случае, указатели вообще не требуются:

struct MutexList {
    std::string text;
    std::unique_ptr<std::mutex> mutex;
};
// ...
MutexList res;
res.text = ...;
res.mutex = std::make_unique<std::mutex>();
cm->UsedFiles.push_back(std::move(res));
// ...
cm->UsedFiles[mutexnum].mutex->lock();
READ ALSO
с++ не работает условие

с++ не работает условие

цикл while срабатывает и при значениях j больше размера массива

139
Одновременно не выводятся оба QLineSeries

Одновременно не выводятся оба QLineSeries

В данном фрагменте кода я пытаюсь вывести некий график с двумя SeriesДля более быстрого вывода я удаляю, заполняю Series и затем добавляю их обратно

108
Очистить буфер ввода

Очистить буфер ввода

Пытаюсь написать кроссплатформенную функцию, аналог system("pause");

126
Как добавить программу в автозагрузку Windows используя C/C++?

Как добавить программу в автозагрузку Windows используя C/C++?

Можно ли добавить программу в автозагрузку с помощью C/C++? (без WinAPI)

135