Size: a a a

cxx.Дискуссионная

2020 April 20

Е

Егор in cxx.Дискуссионная
Alexander Zaitsev
не зря же средство в языке до сих пор есть
так обратная совместимось же
источник

G

GNU/Плюшка in cxx.Дискуссионная
Alexander Zaitsev
не зря же средство в языке до сих пор есть
зря
источник

RM

Roy Mustang in cxx.Дискуссионная
в atomic_flag метод test_and_set нужно проверять как if(!test_and_set()) { true } ?
источник

RM

Roy Mustang in cxx.Дискуссионная
Он по сути ставит true состояние, но возвращает прежнее
источник

RM

Roy Mustang in cxx.Дискуссионная
Так что, если вернул false, значит он свободен щас
источник

RM

Roy Mustang in cxx.Дискуссионная
Впринципе
источник

RM

Roy Mustang in cxx.Дискуссионная
готово
источник

RM

Roy Mustang in cxx.Дискуссионная
тестовый вариант
источник

RM

Roy Mustang in cxx.Дискуссионная
Работает как описывал выше
источник

RM

Roy Mustang in cxx.Дискуссионная
Конечно, есть варнинги на goto методы
источник

RM

Roy Mustang in cxx.Дискуссионная
но без них пришлось бы много работы лишней выполнять
источник

RM

Roy Mustang in cxx.Дискуссионная
источник

RM

Roy Mustang in cxx.Дискуссионная
Реализация простая
источник

RM

Roy Mustang in cxx.Дискуссионная
Есть N потоков, которые гуляют и выполняют что хотят
источник

RM

Roy Mustang in cxx.Дискуссионная
а есть контейнер который является неблокирующим
источник

RM

Roy Mustang in cxx.Дискуссионная
Контейнер хранит в себе список задач (задачи могут быть помещены например из TCP потока, прилетел пакет - реализовал задачу и пихнул в контейнер)
источник

RM

Roy Mustang in cxx.Дискуссионная
Любой из потоков берет задачу из queue, выполняет ее и остлеживает ее состояние
источник

RM

Roy Mustang in cxx.Дискуссионная
Если в какой то из функции где используется общая память (где нужно блокировать потоки), то блокировка не происходит
источник

RM

Roy Mustang in cxx.Дискуссионная
На скрине выше поток 0 выполнял задачу TaskID: 1 и он вызвал общий метод где есть atomic_flag (это тестовая функция, которая использует флаг блокировки, представим что там был какой нибудь unordered_map)
источник

RM

Roy Mustang in cxx.Дискуссионная
Так вот, каждый раз когда один из потоков умудряется забрать себе работу функции, где выполняется установка atomic_flag (я сделал чтоб этот поток спал некоторое время, чтоб проверить что будет делать второй поток), тем самым, второй поток где то у себя выполнил свои методы для TaskID: 2, а потом пришел в общую функцию где происходит блокировка, так как нужно что-то поместить в unordered_map к примеру
источник