Я ведь тебе уже объяснил, что здесь не нужна никакая синхронизация
Блин, зачем задавать вопросы, если можно для начала пройти какой-нибудь курс или книгу почитать?
Мы тебе в следующий раз также ответим :)
Мне нужно всё обдумать. Пока что для меня атомик - это замена мьютексов для ленивых, хахах
Человек простейших принципов конкаренси не понимает Самый правильный ответ на него вопрос — почитать книгу
Ответ на любой вопрос можно найти в книгах. Если так, то зачем этот чат?
Потому что ты спрашиваешь базовые вопросы, которые можно на любом курсе прочитать по многопотоку. В итоге это превращается в твою личную лекцию из 10 преподов
Здесь вопрос не в ленивости, а в производительности. И разных паттернах, в которых используют эти вещи
Если на пальцах: atomic позволяет атомарно записать или прочитать значение. Замечу, что среди этих операций нет "получить ссылку". Кроме того, для целочисленных типов, например, поддерживаются некоторые атомарные операции изменения. Если бы atomic работал на string'е, то: 1. Либо он должен предоставлять операции для inplace атомарной модификации, что в случае стринги сложно/невозможно реализовать эффективно 2. Либо вся работа будет сводиться к std::string s = atomic.load(); s[0] = 'a'; atomic.store(s);, где у тебя нет никаких гарантий атомарности этой группы операций. Попробуй представить, как бы ты хотел работать с std::atomic<std::string> s - покажи пример гипотетического кода.
Спасибо большое за объяснение :) Глупенький пример, но просто чтобы показать, как это могло бы выглядеть: std::atomic<std::string> str; void task() { str += rand() % 2 == 0 ? "A" : "B"; } // Creating 10 threads with 'task' and detaching them
Ииии... У тебя программа медленнее однопоточной
Если замедление из-за потоковых абстракций, то хорошо - пусть в task() будет что-то, что должно продолжаться, скажем, секунду :D
Замедление из-за атомарного стринга. Попробуй запустить программу из 10 потоков, который бы атомарный инт на 20 инкрементил каждый, и однопоточную.
У тебя в итоге многопоточная программа будет из синхронных += стринга и синхронизации, которая время тратит
Допустим. Тогда: 1. Для std::atomic<std::string> должен существовать перегруженный operator +=. А почему только он? Тогда вообще весь интерфейс std::string должен быть продублирован. 2. Операцию += для строки вряд ли можно реализовать без мьютекса (так как она потенциально подразумевает аллокацию), поэтому на практике std::atomic<std::string> будет std::mutex + std::string
[Stopwatch::stop() / 1 Thread]: Time: 0 milliseconds [Stopwatch::stop() / 10 Threads] Time: 91 milliseconds
Спасибо, теперь всё встало на свои места)
И тебя не смутило, что в первом случае компилятор все сам посчитал?
Почему? Счёт мог идти и на наносекунды
Да, там 7 наносекунд в первом примере - компилятор сам ничего не посчитал)
Обсуждают сегодня