2015-03-08 3 views
1

Я портирование стопорную бесплатно очереди из C++ 11, чтобы пойти и я наткнулся на такие вещи, какПерейти атомные и память порядка

auto currentRead = writeIndex.load(std::memory_order_relaxed); 

, а в некоторых случаях и std::memory_order_releasestd::memory_order_aqcuire также equivelent для выше в c11 нечто вроде

unsigned long currentRead = atomic_load_explicit(&q->writeIndex,memory_order_relaxed); 

смысл тех описывается here

находится там п эквивалентна такой вещи в дороге или же я просто использовать что-то вроде

var currentRead uint64 = atomic.LoadUint64(&q.writeIndex) 

после портирования я протестированные и только с помощью LoadUint64, кажется, работает, как ожидалось, но порядки медленнее и я задаюсь вопросом, сколько эффект дозы эти специализированные опы "надеты" работа.

  • дополнительно информация от ссылки я прикреплен

memory_order_relaxed: Relaxed операции: нет синхронизации или заказные ограничений, только атомарность требуется эта операция.

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

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

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

ответ

6

Вы должны прочитать The Go Memory Model

Вы обнаружите, что Go не имеет ничего общего контроля, что у вас есть в C++ - не существует прямой перевод функций C++ в вашем посте. Это преднамеренное дизайнерское решение авторов Go - девиз Go - Do not communicate by sharing memory; instead, share memory by communicating.

Предполагая, что стандартный канал перехода недостаточно хорош для того, что вы хотите сделать, у вас будет 2 варианта для каждого доступа к памяти, используя средства в sync/atomic или нет, и нужно ли им использовать их или нет будет зависеть от тщательного чтения модели памяти Go и анализа вашего кода, который вы только можете сделать.

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