![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
0xDEAD |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: 3 Всего: 3 |
Добрый день.
Я тут читаю про синхронизацию между потоками процесса, и на msdn есть такой пример: http://msdn.microsoft.com/en-us/library/ms686355(VS.85).aspx Они пишут что так писать не thread-safe:
И по этому лучше писать так:
Зачем нужны InterlockedExchange мне понятно, но вот насчет InterlockedCompareExchange... Во первых, по моему это по мухе с пулемета, и сравнивать и писать то же значение только для того, чтобы еще раз сравнить. Во вторых, нужно ли оно тут вообще? if(fValueHasBeenComputed) ведь только один раз читает память, что есть, как я понимаю, атомная операция. |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
Если внимательно почитать статью, то так писать лучше лишь в 2003 студии. А в 2005 уже можно писать без InterlockedExchange, достаточно только объявить переменные volatile.
Если у вас 2003, стоит задуматься над переходом на более свежую версию компилятора. Это сообщение отредактировал(а) volatile - 12.9.2011, 00:30 |
|||
|
||||
0xDEAD |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: 3 Всего: 3 |
Хм, я не совсем понимаю.
Написано: * the compiler will not re-order volatile variable access. However, these operations could be re-ordered by the processor. * With Visual Studio 2005, the compiler uses acquire semantics for read operations on volatile variables and release semantics for write operations on volatile variables. То есть: * Компилятор компилирует volatile в точно такой же последовательности, как написано в коде. Но несмотря на это, процессор может изменить эту последовательность. * VS 2005 использует acquire/release semantics (если я правильно понял, речь о LOCK командах) с volatile. Так вот, я пользуюсь VS 2010. Я скомпилировал первый код, с volatile, но никаких LOCK-ов в компилированном коде нету. Правильно ли я понимаю значение acquire/release semantics в тексте, и фразу "operations could be re-ordered by the processor"? |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
Не обязательно.
Ну во-первых может быть, они в вашем конкретном случае и не нужны. ![]() вот здесь объясняется подобный случай. |
|||
|
||||
0xDEAD |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 20.9.2009 Репутация: 3 Всего: 3 |
ОК, я понял что тема эта не простая.
Тут есть два понятия: * Атомарность. * Последовательность обновления значений для других процессоров. volatile гарантирует последовательность обновления значений - то есть что iValue обновится перед fValueHasBeenComputed, а не наоборот. А атомарность в этом случае гарантированна, потому что чтение/запись из/в выравненный DWORD есть "Guaranteed atomic operation". Интересная ссылка: http://stackoverflow.com/questions/5002046...myth-or-reality |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |