Имеет ли смысл заключать в mutex-ы 1 операцию присваивания вида переменная=константа или переменная=переменная на C? (типы примитивные — int/float/итп). Иными словами — можно ли полагаться на ее атомарность? Где это написанно?
Linux/pthread-s.
PS lock xchg ??
Re: многопоточность. атомарность операции присваивания.
Здравствуйте, shestero, Вы писали:
S>Имеет ли смысл заключать в mutex-ы 1 операцию присваивания вида переменная=константа
Нет, а зачем?
S>или переменная=переменная на C? (типы примитивные — int/float/итп). Иными словами — можно ли полагаться на ее атомарность? Где это написанно?
В общем случае, операции не атомарны. Но переменные могут быть и в регистрах, тогда проблем не будет.
S>Linux/pthread-s.
Про это не знаю.
S>PS lock xchg ??
Операция не требует lock префикс.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: многопоточность. атомарность операции присваивания.
Здравствуйте, shestero, Вы писали:
S>Имеет ли смысл заключать в mutex-ы 1 операцию присваивания вида переменная=константа или переменная=переменная на C? (типы примитивные — int/float/итп). Иными словами — можно ли полагаться на ее атомарность? Где это написанно? S>Linux/pthread-s.
S>PS lock xchg ??
Для атомарных операций над примитивами лучше использовать функционал asm/atomic.h. Это будет работать гораздо быстрее, чем через мьютексы и гораздо переносимее, чем самостоятельная реализация.
Re: многопоточность. атомарность операции присваивания.
От:
Аноним
Дата:
27.01.06 08:32
Оценка:
S>Имеет ли смысл заключать в mutex-ы 1 операцию присваивания вида переменная=константа или переменная=переменная на C? (типы примитивные — int/float/итп). Иными словами — можно ли полагаться на ее атомарность? Где это написанно?
Вроде бы, если она неправильно выровнена, то операции с ней могут быть неатомарными.
Кроме того, существенно, как она используется.
Если это, скажем, текущее измеренное значение температуры, то, может, и не имеет.
А если это какой-то флажок, скажем
g_data1 = &data1;
g_data2 = &data2;
g_all_data_ready = true; // ну уж один байт не может быть неатомарным :)
On Thu, 26 Jan 2006 18:49:17 -0000, shestero <36780@users.rsdn.ru> wrote:
> Имеет ли смысл заключать в mutex-ы 1 операцию присваивания вида переменная=константа или переменная=переменная на C? (типы примитивные — int/float/итп). Иными словами — можно ли полагаться на ее атомарность? Где это написанно? > Linux/pthread-s.
Имеет смысл. Даже если операция атомарна, требуется обеспечить visibility, т.е. чтобы остальные процессоры узнали об изменение памяти, сделанным другим процессором. Для этого используют memory barrier. lock/unlock мьютекса — memory barrier.
-- Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[2]: многопоточность. атомарность операции присваивания.
Здравствуйте, DangerMan, Вы писали:
DM>Для атомарных операций над примитивами лучше использовать функционал asm/atomic.h. Это будет работать гораздо быстрее, чем через мьютексы и гораздо переносимее, чем самостоятельная реализация.
Здравствуйте, shestero, Вы писали:
S>Имеет ли смысл заключать в mutex-ы 1 операцию присваивания вида переменная=константа или переменная=переменная на C? (типы примитивные — int/float/итп). Иными словами — можно ли полагаться на ее атомарность? Где это написанно? S>Linux/pthread-s.
S>PS lock xchg ??
S>Имеет ли смысл заключать в mutex-ы 1 операцию присваивания вида переменная=константа или переменная=переменная на C? (типы примитивные — int/float/итп). Иными словами — можно ли полагаться на ее атомарность? Где это написанно? S>Linux/pthread-s. S>PS lock xchg ??
Вне контекста того что ты делаешь — это сказать невозможно. Атомарность каких-любо модификаций вообще нужна только в том случае, когда существует concurrency (борьба потоков за ИЗМЕНЕНИЕ данных) И только в том случае, когда возникает нежелательный side-effect.
Re[2]: многопоточность. атомарность операции присваивания.
От:
Аноним
Дата:
30.01.06 08:39
Оценка:
AR>Вне контекста того что ты делаешь — это сказать невозможно. Атомарность каких-любо модификаций вообще нужна только в том случае, когда существует concurrency (борьба потоков за ИЗМЕНЕНИЕ данных) И только в том случае, когда возникает нежелательный side-effect.
Т.е. если один поток только пишет, а второй только читает, атомарность по-вашему не нужна — за ИЗМЕНЕНИЕ-то они не борются?
Всё-таки читать что-то наполовину записанное тоже неправильно.
Re: многопоточность. атомарность операции присваивания.
От:
Аноним
Дата:
30.01.06 08:43
Оценка:
Если переменные разделяемы, то следует.
Re[3]: многопоточность. атомарность операции присваивания.
Здравствуйте, Аноним, Вы писали:
А>Т.е. если один поток только пишет, а второй только читает, атомарность по-вашему не нужна — за ИЗМЕНЕНИЕ-то они не борются?
Атомарности недостаточно на smp.
Re[3]: многопоточность. атомарность операции присваивания.
AR>>Вне контекста того что ты делаешь — это сказать невозможно. Атомарность каких-любо модификаций вообще нужна только в том случае, когда существует concurrency (борьба потоков за ИЗМЕНЕНИЕ данных) И только в том случае, когда возникает нежелательный side-effect. А>Т.е. если один поток только пишет, а второй только читает, атомарность по-вашему не нужна — за ИЗМЕНЕНИЕ-то они не борются? А>Всё-таки читать что-то наполовину записанное тоже неправильно.
Выше мной было написано И когда возникает нежелательный side-effect.
Синхронизация только по тому поводу что что-то там "наполовину записано" не нужна, если это не отражается на желаемом поведении алгоритма/программы.
Простой пример, который я уже когда-то уже кому-то приводил.
Допустим, один поток (или много таких) рисует на экране некий объект. Ну скажем, картинку-спрайт. Рисует он считывая две координаты X,Y. Другой поток, или даже множество потоков постоянно перезаписывают эти две переменные X,Y. Так вот, в моей архитектуре записывающий поток может как угодно переписывать переменные X,Y. Из того что он успеет изменить только X, или только Y координату объекта, а читающий поток прочитает "наполовину измененнные данные" — ничего страшного абсолютно не будет. Да, объект на экране нарисуется чуть в другой позиции. Но мне это совершенно приемлемо. Причем это допустимо не только когда объект рисуется совершенно случайно, но и в т.ч. когда последовательность координат представляет собой некую гладкую функцию. Из того что произошла рассогласованность X,Y — ничего страшного не произойдет в данном случае.
Этот случай можно расширить на МАССИВ координат X,Y. Все будет аналогично — синхронизация не потребуется, никаких эффектов не возникает, даже если массив координат изменен всего лишь наполовину, и даже если при этом изменена лишь какая-то одна координата X.
Пример выше можно распространить и на C++ объекты — не всегда несогласованное изменение данных класса фатально для пользователей класса.
И также на другие случаи — например изменение циклического аудио-буфера. Один поток читает, другой пишет. Между ними нужна логическая программная синхронизация (по-очередность) но вовсе не синхронизация доступа к буферу.
Re[2]: многопоточность. атомарность операции присваивания.
On Mon, 30 Jan 2006 13:15:36 -0000, Awaken <12048@users.rsdn.ru> wrote:
> S>>PS lock xchg ?? > > _>используй Interlocked операции > > > вроде речь про Линукс функций винапи там нет