Как управлять синхронизацией потоков в C++ для потоков, которым требуется доступ к двум разным ресурсам из пула ресурсовC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как управлять синхронизацией потоков в C++ для потоков, которым требуется доступ к двум разным ресурсам из пула ресурсов

Сообщение Anonymous »


Эта программа имитирует несколько потоков, обращающихся к разным ресурсам. У меня есть пул ресурсов, в моем случае массив логических значений: bool res[6] = {1, 1, 1, 1, 1, 1}; У меня также создано 6 разных потоков, которым нужен доступ к двум из этих ресурсов одновременно:

T1 -> требуется разрешение [0] и разрешение [1] T2 -> требуется разрешение [1] и разрешение [2] T3 -> требуется разрешение [2] и разрешение [3] T4 -> требуется разрешение [3] и разрешение [4] T5 -> нужны разрешения [4] и разрешения [5] T6 -> требуется разрешение [0] и разрешение [5] Когда поток использует ресурс, он устанавливает логическое значение в 0, а после завершения обратно в 1. Пример: T1 устанавливает для res[0] и res[1] значение 0, «использует его» и затем возвращает оба значения обратно в 1.

Я не знаю, как использовать мьютекс или семафор для предотвращения состояний гонки.

Очевидный, но медленный способ — использовать мьютекс для блокировки всего раздела, когда поток использует два ресурса, и разблокировать его, когда это будет сделано, не позволяя любому другому потоку использовать какой-либо ресурс. Проблема в том, что некоторые потоки должны иметь возможность запускаться одновременно, например: T1 и T3 не используют общие ресурсы и, следовательно, должны иметь возможность выполнять свои действия одновременно. С другой стороны, T1 и T2 не должны работать одновременно, поскольку они используют общий ресурс res[1]. Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: Вот что я пробовал с семафорами для каждого ресурса. Я думаю, что это решение работает, но я могу ошибаться:
#include #include #include #include #include #include #include #include #include #include #include bool el1[6]={1,1,1,1,1,1}; const int64_t tempsCreationObjetsMS = 3000; std::binary_semaphore sem0{0}, sem1{0}, sem2{0}, sem3{0}, sem4{0}, sem5{0}; void creer_thread (std::string nom) { if(nom == "купе") { std::osyncstream(std::cout)
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»