Блокировка мьютексов C ++ для набора потоков - PullRequest
2 голосов
/ 08 мая 2020

Я понимаю, что основной c принцип мьютекса состоит в том, чтобы защитить указанный c кодовый путь от доступа более чем 1 потоком.

В моей текущей настройке у меня 10 потоков типа A ( A1-A10) и 10 ниток типа B (B1-B10). Под типом я подразумеваю потоки, которые работают с бесконечным l oop и вызывают методы A () и B () соответственно. Из этих методов A и B они оба вызывают функцию X ().

Я пытаюсь заблокировать определенную часть кода в функции X (), чтобы в любое время из пара A и B (A1: B1, A2: B2 ...) только 1 получает доступ к этому пути. Это означает, что либо A1 находится в этом кодовом пути, либо B1, аналогично либо A2 находится в этом кодовом пути B2 и так далее. Это нормально, если A1, A2, B3, B4, A5 .. одновременно обращаются к этому пути кода. Просто из пары AB к этому коду обращается только 1 поток.

Как это реализовать?

X() {

// 
Lock this code so that either of (A1, B1) can access it 
and so on..
//
}

1 Ответ

1 голос
/ 08 мая 2020

Вы ищете 10 мьютексов, один для A1 / B1, один для A2 / B2 и т. Д. c. Вы можете поместить их в массив и просто получить доступ к нужному.

Кроме того, для ясности, мьютексы обычно не защищают пути кода. Они защищают данные. Итак, если у вас есть список, в этом списке может быть мьютекс, чтобы только один поток за раз мог изменять список (и ни один поток не обращается к списку, пока другой поток его изменяет). Если у вас несколько списков, вы даете каждому списку свой собственный мьютекс, поэтому один и тот же путь кода будет использоваться несколькими потоками одновременно, но это нормально, потому что каждый работает с другим списком. Судя по вашему описанию, вы пытаетесь сделать что-то подобное.

...