Как потоки могут записывать в разные ячейки матрицы - PullRequest
0 голосов
/ 13 июня 2011

У меня есть глобальная матрица (тип vector >), и мне нужно несколько потоков, чтобы иметь возможность писать в нее так, как я сказал.Сначала я думал об использовании только одного мьютекса, потому что я боюсь состояния гонки (доступ + запись не может быть атомарным). Затем я использовал матрицу мьютексов.Я не совсем уверен в этом.Кажется, это та же самая проблема.

Можете ли вы помочь мне, пожалуйста?Я добавлю больше деталей, если вам нужно.Спасибо

1 Ответ

1 голос
/ 14 июня 2011

Вам нужен только мьютекс для защиты объектов, к которым обращается более чем один поток, где хотя бы один из этих потоков изменяет объект.

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

Если один поток пишет в ячейку, а другой читает из одной и той же ячейки, то оба потока должны заблокировать один и тот же мьютекспрежде чем они получат доступ к этой камере.Если два потока записывают в одну и ту же ячейку, то снова оба потока должны заблокировать один и тот же мьютекс.Это может быть мьютекс, отличный от того, который используется для других ячеек, или тот же.

Если один поток изменяет структуру матрицы, в то время как любые другие потоки обращаются к матрице, то все вовлеченные потоки должны блокировать одинаковыемьютекс.Это может быть другой мьютекс для любых мьютексов, используемых для отдельных клеток, или тот же самый.

...