2014-02-03 4 views
0

Предположим, у меня есть указатель на указатель на указатель, т. Е. Int *** ptr, где он содержит трехмерный массив. В зависимости от процессора я хочу иметь примерно три потока, записывающих и считывающих одновременно мой указатель. Для простоты, ptr не будет перенаправлен (я все еще хочу знать, как обращаться с многопоточным, если мне нужно было переназначить указатель). Я хочу писать одновременно с указателем без использования мьютексов, потому что он блокирует другие потоки. Как мне это сделать? Я до сих пор не совсем понимаю атомные шаблоны ...C++ многопоточный указатель на указатель на указатель

Спасибо! :)

+1

Мьютекс - это то, как вы * будете обрабатывать параллелизм в этом ... Если вы меняете, где указатели указывают, вы не хотите, чтобы другие потоки смотрели не туда ... –

+0

Собственно, я не меняю сам указатель; Я изменяю значение, на которое указывает указатель. Пример: ptr [0] [0] [0] = что-то. – Thecheeselover

+0

@ user2924010 Если у вас действительно нет изменения размера, то есть вы в основном имеете 'myArray [x] [y] [z]' с значениями времени выполнения, тогда вы должны быть в порядке с 'std :: atomic '. Таким образом, все элементы «безопасны» для чтения и записи. Если какой-либо из массивов должен измениться, вам потребуется синхронизация (мьютексы). Вы можете рассмотреть вопрос об упаковке этого типа для обработки этого внешнего кода клиента. –

ответ

1

Это зависит от того, как работают ваши потоки.

Все темы могут считываться из заданного местоположения без конфликтов, но он меняет значение (одновременно меняет значение, считывает значение при его изменении или использует измененное значение чтения), которое является проблема.

Если вы указали, что никакие значения не будут изменены между потоками (например, поток 1 записывает в ptr [0] [0] [x], поток 2 ptr [0] [1] [x], поток 3 ptr [0] [2] [x]) вам вообще не нужно делать какие-либо мьютексы.

Если у вас нет этой гарантии, вы должны использовать mutex для каждого чтения и записи значений.

Отмена изменения существенно меняет значение указателя. Поэтому, если только один поток должен иметь дело с изменяемым значением указателя, вам не нужно беспокоиться об этом. Else, mutex для каждого чтения и записи. Поэтому, если только один поток когда-либо обращается к ptr [0] [0], и вам нужно изменить размер ptr [0] [0], тогда вы являетесь золотым.

Если у вас нет этой гарантии, вы должны использовать mutex для каждого чтения и записи значений.

Смежные вопросы