Как управлять синхронизацией потоков в C++ для потоков, которым требуется доступ к двум разным ресурсам из пула ресурсов ⇐ C++
Как управлять синхронизацией потоков в C++ для потоков, которым требуется доступ к двум разным ресурсам из пула ресурсов
Эта программа имитирует несколько потоков, обращающихся к разным ресурсам. У меня есть пул ресурсов, в моем случае массив логических значений: 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)
Эта программа имитирует несколько потоков, обращающихся к разным ресурсам. У меня есть пул ресурсов, в моем случае массив логических значений: 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)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как мне получить доступ к ресурсам в моем пакете ресурсов (во время установки)
Anonymous » » в форуме Android - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-