Size: a a a

2020 August 19

ПК

Побитый Кирпич... in pro.cxx
Причина почему там не 2 всегда в другом
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
Причина почему там не 2 всегда в другом
Причина в том, что в один момент может быть x == true и y == false. sequential consistency гарантирует, что из read_x_then_y и read_y_then_x всегда будет виден этот порядок
источник

m

magras in pro.cxx
Liber Azerate
Там в любом случае по итогу выполнения потоков будет 2, иначе там просто был бы бесконечный цикл и всё
Нет. Есть такой порядок:
write_x
read_x_then_y
write_y
read_y_then_x


read_x_then_y не будет инкрементить.
источник

LA

Liber Azerate in pro.cxx
magras
Нет. Есть такой порядок:
write_x
read_x_then_y
write_y
read_y_then_x


read_x_then_y не будет инкрементить.
Да, и вправду. Спасибо. Ладно, всё, что я скажу по итогу, так что описание join()-а в этой книге некорректно.
С другой стороны, если бы join() был именно таким, никакой гонки не было бы и запись true в обе переменные произошла бы до чтения. Впрочем, да, спишем всё на гонку
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Да, и вправду. Спасибо. Ладно, всё, что я скажу по итогу, так что описание join()-а в этой книге некорректно.
С другой стороны, если бы join() был именно таким, никакой гонки не было бы и запись true в обе переменные произошла бы до чтения. Впрочем, да, спишем всё на гонку
Если ты про связь join-а со скоупом, то да, это фигня
источник

ПК

Побитый Кирпич... in pro.cxx
Там на скоуп влияние только в плане "если не вызвать Join, то будет terminate в деструкторе std::thread при выходе из скоупа"
источник

ПК

Побитый Кирпич... in pro.cxx
Но это другое
источник

S

Sasha in pro.cxx
Есть необходимость иметь уникальный айдишник для некоторых типов чтобы их можно было сравнивать в рантайме, что-то вроде std::type_index.
Требования:
- переносимость не нужна (т.е. достаточно чтобы решение работало на одном компиляторе)
- поддержка полиморфных типов не нужна
- стандарт C++03 (т.е. std::type_index нельзя, он AFAIK только в 11ом появился)
- RTTI отключен (вроде как без него typeid() тоже не работает)
- читабельные имена типов и прочие плюшки не обязательны, достаточно чтобы тайп-айди был уникальным и его можно было сравнивать с другими тайп-айди

Пока смотрю на следующие трюки:
1. Адрес статического метода шаблонного класса, типа template<typename T> struct TypeInfo { static void get() {} };.
2. Шаблонная функция + макрос типа __PRETTY_FUNCTION__ который сгенерит строку для нее + адрес на эту строку. AFAIK именно этот трюк используется в boost:typeindex для ctti.
3. Какой-нибудь статический счетчик для типов.

Какие подводные камни у трюков выше? Что чатик может посоветовать?
источник

ПК

Побитый Кирпич... in pro.cxx
Sasha
Есть необходимость иметь уникальный айдишник для некоторых типов чтобы их можно было сравнивать в рантайме, что-то вроде std::type_index.
Требования:
- переносимость не нужна (т.е. достаточно чтобы решение работало на одном компиляторе)
- поддержка полиморфных типов не нужна
- стандарт C++03 (т.е. std::type_index нельзя, он AFAIK только в 11ом появился)
- RTTI отключен (вроде как без него typeid() тоже не работает)
- читабельные имена типов и прочие плюшки не обязательны, достаточно чтобы тайп-айди был уникальным и его можно было сравнивать с другими тайп-айди

Пока смотрю на следующие трюки:
1. Адрес статического метода шаблонного класса, типа template<typename T> struct TypeInfo { static void get() {} };.
2. Шаблонная функция + макрос типа __PRETTY_FUNCTION__ который сгенерит строку для нее + адрес на эту строку. AFAIK именно этот трюк используется в boost:typeindex для ctti.
3. Какой-нибудь статический счетчик для типов.

Какие подводные камни у трюков выше? Что чатик может посоветовать?
Если кол-во типов ограничено и небольшое, то думаю достаточно просто нафигачить специализацию шаблона на каждый тип.
Если нужно больше универсальности, то вариант использовать boost::typeindex самый адекватный
источник

S

Sasha in pro.cxx
Побитый Кирпич
Если кол-во типов ограничено и небольшое, то думаю достаточно просто нафигачить специализацию шаблона на каждый тип.
Если нужно больше универсальности, то вариант использовать boost::typeindex самый адекватный
Кол-во типов таки потенциально неограниченно. Можно конечно делать специализации на каждый тип, но не хотелось бы.

А какие явные минусы 1го и 3го подходов?
источник

ПК

Побитый Кирпич... in pro.cxx
Sasha
Кол-во типов таки потенциально неограниченно. Можно конечно делать специализации на каждый тип, но не хотелось бы.

А какие явные минусы 1го и 3го подходов?
Ну я  не вижу в них  универсальности
источник

ПК

Побитый Кирпич... in pro.cxx
А не, я просто не понял их
источник

ПК

Побитый Кирпич... in pro.cxx
В варианте 1 надо ещё доказать, что мы имеем право сравнивать указатели на функции
источник

ПК

Побитый Кирпич... in pro.cxx
Мне это не очевидно
источник

ПК

Побитый Кирпич... in pro.cxx
Вариант 3 я не понял
источник

AK

Alexey Kuznetsov in pro.cxx
Sasha
Есть необходимость иметь уникальный айдишник для некоторых типов чтобы их можно было сравнивать в рантайме, что-то вроде std::type_index.
Требования:
- переносимость не нужна (т.е. достаточно чтобы решение работало на одном компиляторе)
- поддержка полиморфных типов не нужна
- стандарт C++03 (т.е. std::type_index нельзя, он AFAIK только в 11ом появился)
- RTTI отключен (вроде как без него typeid() тоже не работает)
- читабельные имена типов и прочие плюшки не обязательны, достаточно чтобы тайп-айди был уникальным и его можно было сравнивать с другими тайп-айди

Пока смотрю на следующие трюки:
1. Адрес статического метода шаблонного класса, типа template<typename T> struct TypeInfo { static void get() {} };.
2. Шаблонная функция + макрос типа __PRETTY_FUNCTION__ который сгенерит строку для нее + адрес на эту строку. AFAIK именно этот трюк используется в boost:typeindex для ctti.
3. Какой-нибудь статический счетчик для типов.

Какие подводные камни у трюков выше? Что чатик может посоветовать?
Через динамические либы работает только способ номер 2, если есть dll boundary то выбор очевиден.
источник

S

Sasha in pro.cxx
Побитый Кирпич
В варианте 1 надо ещё доказать, что мы имеем право сравнивать указатели на функции
Я сейчас глянул реализацию std::any в gcc - там именно такой подход и используется в кишках std::any_cast. У каждого типа есть статический метод _S_manage, каждый std::any хранит его как _M_manager, в кишках std::any_cast они сравниваются.
источник

S

Sasha in pro.cxx
Побитый Кирпич
Вариант 3 я не понял
Идея в том, что где-то хранится статический счетчик, при каждом вызове getTypeInfo<T>() он увеличивается и сохраняется в другую статическую переменную для этого T
источник

S

Sasha in pro.cxx
Alexey Kuznetsov
Через динамические либы работает только способ номер 2, если есть dll boundary то выбор очевиден.
Вот это хорошее замечание, спасибо
источник

ПК

Побитый Кирпич... in pro.cxx
Sasha
Я сейчас глянул реализацию std::any в gcc - там именно такой подход и используется в кишках std::any_cast. У каждого типа есть статический метод _S_manage, каждый std::any хранит его как _M_manager, в кишках std::any_cast они сравниваются.
Ну, это не аргумент в общем случае
источник