Viacheslav
Многие на его misaligned reads погорели при портировании кода.
Andy
/help@FailsBot
Andy
Привет всем, есть вопрос, студия 2017, С++, при создании нового проекта из существующего исходного кода студия зависает, снимать надо из менеджера задач, проект в итоге пустой, с тем же шарпом например такой проблемы нет, удаление-добавление с++ в установщике помогает не на долго
Andy
хотите сказать что это стандартная фича студии ? 😁😁
🐙 Antony
В начале acquire, потому что consume не рекомендуется с C++17 В конце seq_cst, потому что это не частый кейс и не стоит там преждевеременно оптимизировать
🐙 Antony
Release будет не достаточно для какой-нить DEC Alpha
🐙 Antony
ой, стоп
🐙 Antony
Пара aquire release - норм
🐙 Antony
** я прочитал release как relaxed
Danil
Подскажите пожалуйста, STL по какой книге лучше начать учить?
Vlad
Подскажите пожалуйста как в VS можно шрифт поменять в редакторе
Vlad
Не могу найти в параметрах
Arseny
Подскажите пожалуйста, STL по какой книге лучше начать учить?
Учить библиотеки без практических заданий грустно и немного бесполезно. Лучше курс найти, если вдруг бывают хорошие
Viacheslav
Пара aquire release - норм
Спасибо большое. А можно объяснить, зачем здесь acquire и release? От какого потенциального memory reorder они в этом случае защитят?
Arseny
Без них можно прочитать указатель до того, как данные, которые по нему можно получить инициализированы
Danil
Мне бы хотелось сначала общее представление о библиотеке получить)
Danil
Учить библиотеки без практических заданий грустно и немного бесполезно. Лучше курс найти, если вдруг бывают хорошие
Arseny
Тогда cppreference полистать
Viacheslav
Без них можно прочитать указатель до того, как данные, которые по нему можно получить инициализированы
Каким образом? Изначально создаётся объект, в котором лежит atomic pointer, в конструкторе объекта он инициализирован в invalid_marker. Далее над кучей подобных объектов несколько потоков работает. Насколько я понимаю, при дальнейшем чтении atomic_pointer я получу либо invalid_marker, либо результат do_stuff.
Viacheslav
Какой указатель тут возможно прочитать до инициализации?
Arseny
Можно получить результат do_stuff, но ещё не увидеть всех изменений, которые в do_stuff сделаны
Viacheslav
do_stuff внутри синхронизирован, пока мьютекс не разблокируется, он ничего не вернёт. То есть happens before для факта наличия invalid_marker внутри atomic_pointer гарантируется тем, что объект надо сначала создать. А в do_stuff мьютекс выступает барьером памяти.
Viacheslav
Я думал, что мне в этом случае достаточно атомарности чтения и записи в сам atomic_pointer, но теперь уже не уверен 😂
Arseny
Я думал, что мне в этом случае достаточно атомарности чтения и записи в сам atomic_pointer, но теперь уже не уверен 😂
Барьер почти всегда должен быть, как с пишущей, так и с читающей стороны. Барьер только с одной из сторон это чаще всего баг. Мьютекс же не гарантирует, что записанные данные скинуться из кеша ядра к тому моменту когда другой потом будет их читать. И не гарантирует, что читающая сторона не воспользуется каким-нибудь старым закешировпнным значением по тому адресу.
Vsevolod
у нас это в хедж фонде на собеседовании у всех спрашивают, про эту максимальную подпоследовательность
Vsevolod
есть линейное
Arseny
Подстроки или подпоследовательности?
Arseny
В смысле выбранные элементы последовательности должны подряд идти или нет?
Vsevolod
ну да, а иначе это k-max, который делается через quick select (тоже за линейное время)
Vsevolod
да
Vsevolod
недавно на хабре читал про оконный алгоритм для этой задачи
Viacheslav
Барьер почти всегда должен быть, как с пишущей, так и с читающей стороны. Барьер только с одной из сторон это чаще всего баг. Мьютекс же не гарантирует, что записанные данные скинуться из кеша ядра к тому моменту когда другой потом будет их читать. И не гарантирует, что читающая сторона не воспользуется каким-нибудь старым закешировпнным значением по тому адресу.
Как это не гарантирует? Если у меня do_stuff, допустим, выглядит как auto pointer lock pointer = calculate_what_it_needs() unlock return pointer Функция в этом виде полностью потокобезопасна, lock/unlock уже все гарантии дают. Мне просто на уровне выше надо избежать блокировки, если результат уже посчитан, так как долбиться туда будут десятки миллионов раз.
Arseny
Нет, не безопасна, если другой поток прочитает этот pointer без барьеров
Viacheslav
pthread_mutex_unlock — это барьер памяти ведь. Где именно тут чтение без барьера?
Arseny
А где барьер в читающем потоке?
Arseny
Значение pointer будет правильное. А вот *pointer может оказаться ерундой при чтении
Anonymous
Посоветуйте литературу по крестам.
Oleg
Лол
Viacheslav
Значение pointer будет правильное. А вот *pointer может оказаться ерундой при чтении
Если мы do_stuff используем отдельно, и все через него ходят, то указатель будет уже на полностью инициализированный объект указывать, так?
Anatoly
@Champaque поищи по тегу #book #books
Arseny
Если мы do_stuff используем отдельно, и все через него ходят, то указатель будет уже на полностью инициализированный объект указывать, так?
То есть как все? atomic ведь общий. Я так понял, что хочется общий атомик, в который один поток может этот указатель сохранить, а другой прочитать, не делая do_stuff.
Viacheslav
Я сейчас только про do_stuff говорю, отдельно от atomic_pointer.
Andrey
Здравствуйте. Подскажите пожалуйста, каким api на c++ под linux-ом устанавливается ip адрес, маска, и шлюз. Может есть какая-нибудь библиотека для чтения и редактирования файла /etc/network/interface. В котором собственно и можно поменять ip и т.д.
Arseny
Я сейчас только про do_stuff говорю, отдельно от atomic_pointer.
А что do_stuff? do_stuff вернёт инициализированные данные. И тот поток, который вызвал do_stuff их даже сразу правильно увидит.
Viacheslav
А что do_stuff? do_stuff вернёт инициализированные данные. И тот поток, который вызвал do_stuff их даже сразу правильно увидит.
А теперь сверху лепим тупой кэш. Если видим invalid_marker, который там гарантированно будет при создании объекта, то всегда идём в do_stuff, другого способа получить указатель на объект нет. do_stuff возвращает указатель на что-то, что было полностью инициализировано, так как мьютекс внутри обеспечивает все необходимые барьеры. Далее кладём это в atomic_pointer. Из-за гарантий do_stuff я физически ведь не могу записать туда что-то наполовину инициализированное. Единственное, что вполне может случиться, так это что какой-то поток получит ещё раз invalid_marker, но это нормально, потому что он придёт опять в do_stuff и вытащит тот же самый адрес.
Viacheslav
Я изначально и написал acquire / release, но мне кажется, что это лишнее в этом случае, из-за барьеров в do_stuff.
Arseny
Оно инициализированно, но другой поток, который do_stuff не вызывал, а просто прочитал указатель может этого ещё не видеть. Например, у него может быть закешировано старое значение *pointer и никто ему не помешает его использовать.
Viacheslav
*pointer никогда не меняется, объект do_stuff создаёт всего один раз.
Viacheslav
Для заданных входных параметров, само собой.
Arseny
Он сохранить старое значение по адресу pointer
🐙 Antony
*pointer никогда не меняется, объект do_stuff создаёт всего один раз.
А может лучше использовать std::call_once, и, если есть возможность, не пытаться реализовать его функционал самому?
Viacheslav
А может лучше использовать std::call_once, и, если есть возможность, не пытаться реализовать его функционал самому?
У меня есть огромный кэш финансовых транзакций, в которых в ленивом режиме подтягиваются линки между элементами. call_once тут не подходит совсем.
🐙 Antony
Почему нет?
Arseny
Да, почему нет?
Berkus
пушо у вас такого кэша нет
Viacheslav
В основном потому, что его нет, мы не в С++11 мире живём.
🐙 Antony
*pointer никогда не меняется, объект do_stuff создаёт всего один раз.
lock/unlock внутри do_stuff обладают acquire/release семантикой и синхронизируют видимость только между потоками, которые так же зовут acquire/release. Другимим словами, если вам надо чтобы do_stuff синхронизировал между всем потоками, которые не зовут acquire/release, вам надо вставить seq_cst барьер куда-то после его вызова, но до задания нового значения атомарной переменной Но я на 100% не уверен
Square
чот вы меня запутали... пойду еще раз деревенца посмотрю...
Viacheslav
У меня есть огромный кэш финансовых транзакций, в которых в ленивом режиме подтягиваются линки между элементами. call_once тут не подходит совсем.
So it looks like it unconditionally calls __gthrw_pthread_once(int*, void (*)()), and checks the return value. So that pretty much sucks for use-cases where you want to cheaply make sure some initialization got done, while avoiding the static-initialization fiasco. И если вот это верно до сих пор, то call_once ничем не лучше мьютекса окажется.
FailsBot
/help@FailsBot
USAGE: /help - prints this message; /vzhuh [message] - do vzhuh; /start - info about bot.
Square
https://youtu.be/_-3syPxgwqs?t=309
Vlad
Есть кто нибудь на MAC’E,где в xcode находятся файлы которые я создал с помощью fstream?
Berkus
где-то в дебрях deriveddata наверное