На счет того же потока на другом процессоре - думаю тут нет проблемы - при переключении контекста, по моему, происходит синхронизация (где-то читал про это), так что поток на новом ядре увидит как минимум собственные изменения, которые были на предыдущем проце.
Но я бы предпочел явную синхронизацию.
Можешь не называть это гонкой, я не знаю другого подходящего термина.
По формальным признакам (общие данные и нет синхронизации) вижу, что тут возможно состояние гонки.
Но я ее себе не обосновал. Но ошибка есть. Предполагаю, что из-за этого.
Для чего тут атомарные операции?
Атомарные операции - т.к. они включают в себя барьер. Или барьер или атомарные операции c owner.
Кстати, ошибка
Total: 0 asc: 0 dsc: 0 eq: 0
возможно говорит о том, что кастомный мьютекс не обеспечивает барьер памяти. А должен.
Хотя у него там сгенерированная строка не копируется в узел списка, поэтому все манипуляции со списком происходят на пустых узлах без данных. Но хотя бы Total и eq расти должны.
Обе упомянутые ошибки 100% детерминированные и воспроизводятся с одним потоком.
Этот код не запускал, т.к. сейчас на винде сижу, а у него тут фьютексы. Но запускал предыдущую версию с нормальными pthread мьютексами - все работало.
jcmvbkbc, Ну да тут гонка на чтении, аналогично и в unlock(). Нужен барьер или атомарные операции.
Вероятно не правильное срабатывание (или не срабатывание) условия.
Отсюда и появление ошибки.
asmelnik, Учитывая слишком высокое значение сейчас, я бы стремился на вашем месте его уменьшить, а не увеличить. Такое впечатление, что нагрузку на проц создают именно переключения контекста, а не реальная работа.
Если прерывания учитываются в этой цифре, то возможно у вас их слишком много. Попробуйте получить статистику по прерываниям другими способами и определить какие именно срабатывают наиболее часто. Возможно найдете способ повлиять на их количество, а это в свою очередь разгрузит процессор и позволит вашим рабочим процессам выполнять больше работы при меньшем значении CS.
Что же означает параметр "Context switch per second"?
Если это количество переключений задач в секунду планировщиком ОС, то он не адекватно высок. Разве что у вас 1300 ядер в проце.
Для справки точность double ~15-16 значащих десятичных цифр, точность float - ~5-6
Даже если вы будете округлять с помощью round, полученное целое число может быть точно не представимо в плавающем формате, оно будет представлено в приближенном варианте. Вот этот приближенный вариант вы и видите в выводе. Никогда не следует рассчитывать, что в переменной с плавающей точкой лежит точное значение.
yatanai, Ну значит в MSVC эта оптимизация не отключается.
Надо усложнить тест. Создайте несколько реальных объектов и используйте std::move для вызова конструктора перемещения.
В этом случае трейс к нему бесполезен.
С 1.111 видимо то же нет доступа к узлам соседней сети. Тогда полезней было бы увидеть трейс с 1.111, а не наоборот.
flow_sad, Да фиг знает. Я голым mingw не пользовался. Посмотрите в меню пуск, должна быть его папочка и там какая-нибудь консоль.
Скорее всего при запуске из виндовой cmd не находится стандартная плюсовая библиотека, которая лежит где-то в недрах mingw.
Рекомендую использовать msys2+mingw. msys2 - это линуксовая оболочка со всеми необходимыми инструментами + пакетный менеджер. В репозиториях msys2 куча готовых библиотек и разнообразных программ, которые легко ставятся пакетным менеджером.
Или можете использовать MSVS. Только берите старую версию, судя по всему у вас слабый комп. Берите MSVS 2015 например. В MSVS свой собственный компилятор и он нативный для винды. Для новичка в самый раз.
flow_sad, Вы, видимо, пытаетесь запустить программу под отладчиком. Но VSCode не смог найти отладчик. О чем вам и сообщает.
Можете просто запустить программу, без отладчика.
VSCode не содержит ни компилятора ни отладчика, он использует сторонние инструменты, которые вы ему должны предоставить.
Выше нашел только таблицы маршрутизации микротиков.
Я же говорю о таблицах маршрутизации на 1.111 (не доступный) и таком же компе в той же сети, но к которому есть доступ.
Понятно, что на роутерах с таблицей маршрутизации все нормально - другие же узлы доступны друг другу.
zipchik, Что пробовал то?
Что в таблице маршрутизации на не доступном компе и на доступном из той же сети?
Если винда, то команда для вывода таблицы маршрутизации в консоль: route print -4
Вариантов у вас всего 2, учитывая, что все остальные узлы доступны: либо кривая таблица маршрутизации на этом узле, либо где-то на узлах через которые проходит трафик фаерволом блокируется трафик именно с этого адреса.
Проверить таблицу маршрутизации проще.
В Profinet передаваемые данные кодируются в big endian если что.