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

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

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: Новичкам про потоки  (Прочитано 42774 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #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

Сообщений: 3260


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

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

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

Сообщений: 2130



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

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

Сообщений: 11445


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

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

Сообщений: 3260


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

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

Сообщений: 11445


Просмотр профиля
« Ответ #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 и атомарна, но мы никак не сможем вернуть "верное" значение которое должен возвращать оператор ++. Как все знают, здесь "верное" не значит "текущее"



Записан
Vlad_QtCr
Гость
« Ответ #51 : Май 22, 2018, 11:05 »

Пришел новичок ознакомиться с тредом "Новичкам про потоки". Тему не раскрыли((
Прочитал несколько статей с примерами по многопоточности, но не до конца ясно как оно работает и как можно использовать в своих целях (свои примеры с нуля не получаются). Был бы рад готовому примеру (задание-просьба в конце поста).
Считается, что если форма при вычислениях "замирает" (циклы, ожидание ответа устройств...), то лучшим решением будет вставка строки qApp->processEvents(0); вместо создания потоков.
На мой взгляд потоки интересны в приложениях, где дается команда, например, на скачивание файла после чего работа должна продолжаться (т.е. скачивание отправляют в поток). В однопроцессорной системе многопоточное приложение сильно нагружает машину. Фактически выигрыша никакого, т.к. есть определенное количество команд, которые необходимо выполнить и если есть второй процессор (ядро), то он возьмет часть команд на себя. Если ядер нет, то каждый поток будет перываться для того, чтобы процессор выполнил кусочек кода другого потока (это я для таких же новичков как я, которые пока не получили здесь ответа). Наверное перед запуском лучше проверить возможности процессора и тогда принять решение о включении потоков. Не буду дальше философствовать, приведу ожидаемый пример:
Предположим, на диске есть фотка (сделаем кнопку обзора и открытия файла). Пользователь выбирает фоту и она открывается, но! Считывание ведется побайтно. Объем файла делится надвое. Первый поток (не уверен, но видимо основная часть программы) читает файл от 1 байта до (Length_of_file/2), вторая от (Length_of_file/2)+1 до конца файла. На форме GraphicsView или что-то подобное, куда выводятся точки. Очень желательно, чтобы весь проект был создан в Qt Creator.
Почему такой странный пример?
Во множестве руководств можно прочитать про многопоточность, но на представленых примерах не чувствуется фишки многопоточности. Автор одного примера (Шлее?) выводит  на экран букву "А", а во втором потоке "В". Дескать вот, все работает. Моя задача реально покажет возможности multithreading. Кроме того решается вопрос чтения открытого файла из каждого потока. Понятно, что задача, которая справилась быстрее должна "отрубить" себя, уступив ресурсы соседу (можно наверное просто делать return;, хотя лучше дождусь вашего ответа).
Такой вот пример, может ли кто написать? Код должен быть простым и несложным насколько это возможно. Цепляю образец (Qt 4.8 Creator 4.5)
Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


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