Самый быстрый способ обмена данными с разными потоками?

Рассмотрим следующий сценарий с Open MP:

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

Какой самый быстрый способ обеспечить (при условии, что сигнал, сообщающий другим потокам о правильном времени для копирования A, является атомарным, поэтому там нет условий гонки):

  1. Потоки, которые обрабатывают данные, всегда будут использовать обновленные данные (например, нет риска кэширования некоторых данных в регистрах и т. д.).

  2. Хорошее исполнение.


person user0002128    schedule 15.04.2013    source источник
comment
Должен ли быть только один буфер? Может ли поток № 1 вместо этого поставить в очередь несколько меньших * буферов?   -  person Martin James    schedule 15.04.2013


Ответы (1)


Вы можете попробовать блокировку чтения-записи. Поток № 1 удерживает блокировку записи, а другие потоки удерживают блокировку чтения. Таким образом, все остальные потоки могут читать параллельно, только чтение и запись являются взаимоисключающими.

person TieDad    schedule 15.04.2013
comment
Гарантирует ли это, что любое чтение из других потоков приведет к доступу к памяти, а не к попытке загрузить некоторые данные в регистры и т. д.? - person user0002128; 15.04.2013
comment
Блокировке чтения все равно, какие операции чтения вы на самом деле выполняете. Операция чтения может быть чтением из памяти, диска, сети и т. д., в зависимости от вашего кода. Блокировка чтения-записи гарантирует, что операции чтения могут выполняться параллельно, а чтение/запись являются изменяемыми и исключающими. - person TieDad; 15.04.2013
comment
Ну, проблема в том, что бывают случаи, когда поток 2 пытается прочитать некоторые данные в памяти (которые были изменены), и после некоторой оптимизации компилятора этот компилятор думает, что эти данные уже были в регистре, поэтому доступ к памяти отсутствует, и используется старый вместо этого данные хранятся в регистре, я пытаюсь избежать этого условия. - person user0002128; 15.04.2013