Russian Qt Forum
Январь 18, 2018, 03:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: Новичкам про потоки  (Прочитано 5277 раз)
m_ax
Neo
******
Offline Offline

Сообщений: 1754



Просмотр профиля
« Ответ #45 : Январь 12, 2017, 17:28 »

m_ax, что значит похерилось, не совсем понимаю, оно может как-то испортиться? Если я в ячейку, где хранится 5 пишу 6 и одновременно считываю эту же ячейку, то при считывании получу или 5 или 6, в моём понимании.
Если, в общем случае, запись/чтение не атомарна, то при одновременной записи и чтении, кто его знает, что на выходе можно получить..) Может 5, а может 6, а может и 100500  Улыбающийся  
Короче, лучше не рисковать)
« Последнее редактирование: Январь 12, 2017, 17:30 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2468


Просмотр профиля
« Ответ #46 : Январь 12, 2017, 17:46 »

Если, в общем случае, запись/чтение не атомарна, то при одновременной записи и чтении, кто его знает, что на выходе можно получить..) Может 5, а может 6, а может и 100500  Улыбающийся  
Короче, лучше не рисковать)

Запись примитивных типов атомарна, то есть записывая 5, 100500 получить никак нельзя.
Другое дело, что реально оно может быть записано не в память, а в кэш ядра, то есть разные потоки будут видеть разное значение (записавший - новое, остальные - старое).
Соответственно, помимо того, что неизвестно, в каком порядке потоки записали 5 и 6, также неизвестно, в каком порядке будут сброшены кэши (и будут ли). Но вариантов не так много - либо старое значение, либо 5 либо 6.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 1994



Просмотр профиля
« Ответ #47 : Январь 12, 2017, 17:49 »

Бугагашеньки, как оно бывает. Но мне везло.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9879


Просмотр профиля
« Ответ #48 : Январь 12, 2017, 18:08 »

Атомарность - дело хорошее. Не раз видел статьи где утверждают, мол, "если действие выполняется одной машинной командой - оно атомарно". Ладно, вот есть команда
Код
C++ (Qt)
inc dword ptr [1234] ;
Но хорошо известно что инкремент не атомарен, более того если откроем реализацию конкретного atomic, то никакого inc там не увидим. Как же так?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2468


Просмотр профиля
« Ответ #49 : Январь 12, 2017, 18:17 »

Очевидно, что операции связанные с памятью не могут быть "атомарны" (см выше).
Но тут надо определить что значит "атомарность".
В конечном итоге, в памяти может быть что угодно, но это не означает, что где-то мы записали половину числа, а половину "не успели". Нет, мы всегда запишем что-то когда-то целиком. Будет ли это то, что ожидалось? Не факт.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9879


Просмотр профиля
« Ответ #50 : Январь 13, 2017, 15:30 »

Запись примитивных типов атомарна, то есть записывая 5, 100500 получить никак нельзя.
В общем случае нет, пример
Код
C++ (Qt)
#pragma pack(push, 1)
struct CData {
char type;
double value;   // qint64
};
#pragma pack(pop)
 
Вот и "бугага" и все такое. ВСЕГДА используйте штатный atomic (из std, Qt, tbb или откуда хотите). Даже для int'ов которые уж точно сами по себе атомарны.

Очевидно, что операции связанные с памятью не могут быть "атомарны" (см выше).
Но тут надо определить что значит "атомарность".
В конечном итоге, в памяти может быть что угодно, но это не означает, что где-то мы записали половину числа, а половину "не успели". Нет, мы всегда запишем что-то когда-то целиком. Будет ли это то, что ожидалось? Не факт.
Здесь дело не в этом. Возможно машинная команда inc и атомарна, но мы никак не сможем вернуть "верное" значение которое должен возвращать оператор ++. Как все знают, здесь "верное" не значит "текущее"



Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.123 секунд. Запросов: 22.