Маша С++
104 subscribers
54 photos
2 files
65 links
Учу C++ и не только вместе с вами, мои котятки)
Download Telegram
У std::atomic есть метод exchange, который атомарно сохраняет переданный аргумент в this, при этом в этой же "транзакции" возвращает старое значение this.
Получается атомарный read-modify-write, то есть другой поток не вставит свое значение в процессе:
std::atomic<int> x;
int y;
int z = x.exchange(y) // atomically: z = x, x = y

Если вы вдруг не поняли сразу (как я), то exchange() не эквивалентен последовательным вызовам load() и store():
z = x.load(); // not
x.store(y); // atomic !

Понятное дело, что возвращается копия старого значения и по идее, к тому времени когда я просмотрю эту копию, другой поток уже может изменить значение атомика. Возникает вопрос, а в чем тогда смысл и применение этой операции? Ну есть там memory_order вторым параметром, и что?

Оказывается, что есть применение для реализации спинлока:
std::atomic<bool> lock;  // == false
{ // критическая секция, пытаемся захватить lock:
while (lock.exchange(true)) { } // захватили lock
/* наши данные в безопасности */
lock = false; // отпускаем lock
}
Это работает, потому что нам не важно текущее значение атомика, а факт того, что именно наш поток его изменил.
Других применений, кроме как для atomic<bool> пока не нашла.
#cpp #multithreading
Интересная научная статья фокусируется именно на потреблении энергии (CPU + RAM) в дополнении к памяти и времени работы. Авторы сравнивают 27 популярных языков программирования, замеряя потребленные Джоули при решении 10 задач. Замер потребления энергии производится с помощью утилиты Intel’s Running Average Power Limit.

В финальной таблице (см пост ниже) по всем задачам можно например заметить как Java потребляет в 5 раз больше рамы, чем Си. По потреблению энергии и по времени работы в первой тройке C, Rust и C++. Примечательно, что Rust почти не отличается от C, а вот C++ отстает на 30-50%. В статье приводятся результаты для трех задач: binary-trees (выделение, обход и удаление множества двоичных деревьев), fannkuch-redux (индексируемый доступ к крохотным последовательностям интов) и fasta (генерация и запись случайных последовательностей ДНК). В первых двух задачах лидируют C/C++, в третьей же - Rust, при этом C++ в ней довольно заметно отстает. С чем это связано не понятно, возможно на плюсах медленнее вывод в файл или генератор случайных чисел. Ставить под сомнение сводные результаты 10 задач на основе данных по 3 я не буду.

Интересно, что Python уверенно занимает предпоследнюю строчку и в 70 раз "хуже" Си. Спасай природу, переписывай свой питон код на Си 😁

Полный текст статьи: https://haslab.github.io/SAFER/scp21.pdf

#cpp #rust #performance
🔥2
exa (цветастая замена для ls) кажется заброшена
https://github.com/ogham/exa

#github #opensource
"Не слишком специализируйтесь."

"Так что вы не можете просто писать код. Вам нужно что-то сделать с культурой и с тем, как выражать идеи. То есть я ни разу не пожалел о времени, потраченном на историю и математику. Математика обостряет ваш ум, история даёт некоторое представление о ваших ограничениях и о том, что происходит в мире. Так что не будьте слишком уверены. Найдите время, чтобы вести сбалансированную жизнь."

https://habr.com/ru/news/757164/
👍1
"did everybody expect that to happen?" спрашивает докладчик. Такого уж я точно не ожидала. Он сравнил ускорение (speedup на легенде) двух приложений: wait-free находит сумму через std::atomic, в то время как mutex находит ту же сумму, используя одноименную блокировку и обычные (неатомарные) переменные.
Внезапно оказалось, что wait-free масштабируется значительно хуже простого mutex.
Детали и более подробное устройство атомиков тут: https://www.youtube.com/watch?v=ZQFzMfHIxng
#cpp #multithreading
Сегодня 255 день в году, с праздником всех причастных!
Опенсорсная реализация пятой Цивилизации (с "картофельной" графикой). Доступно для Android (включая F-Droid) и для десктопа. Переведена на русский.

https://github.com/yairm210/Unciv

#github #opensorce
Прошла бесплатный быстрый тест (занимает всего 15 минут) на знание английского EF SET. Без регистрации и смс. Ссылка на тест внизу страницы https://www.efset.org/ru/cefr/

#english
Вот нельзя было в плюсах в контейнерах вместо empty() использовать isEmpty() ? Первое вполне себе глагол/действие...
#cpp