Alexander "SonnySlave"
Anonymous
Berkus
Alexander "SonnySlave"
Kirill
Kirill
Anonymous
Anonymous
Совсем без понятия, как можно полиморфные типы идентифицировать, имея указатель на базовый.
Anonymous
И да, на кой в бустах одновременно header guard и pragma once?
Попытался раскопать git blame на гитхабе, но упёрся в момент импорта с SVN.
Kirill
Отдаленный.
Typeinfo можно сранювнивать, но передавать нельзя :(
Berkus
Berkus
и поддерживают борландовские компиляторы
Berkus
поэтому такая хуйня
Berkus
короче, очередей в бусте до жопы и все хуевые донельзя
Berkus
есть и в boost.thread, и в boost.log и в boost.lockfree, и еще где-то забыл уже где
Berkus
Berkus
все из них требуют CopyConstructible мне нахуй не нужный
Berkus
ни один из них не поддерживает даже близко нужный мне апи
Berkus
bool empty() const {
size_t size() const {
void clear() {
void wakeUpAll() {
void enqueue(value_type&& v) {
void enqueueUrgent(value_type&& v) {
template <typename ...Args>
void emplace(Args&&...args) {
template <typename ...Args>
void emplaceUrgent(Args&&...args) {
value_type dequeue() {
value_type waitDequeue() {
value_type waitDequeue(std::chrono::milliseconds timeout) {
вроде не слишком много прошу?
Anonymous
По-моему ты просишь очередь и condition_variable в одном классе.
Berkus
ну оно у меня так примерно и сделано было - мьютекс и два дека, но что-то ASan мне проел плешь что объект используется после удаления - пытаюсь понять что ему не нравится
Vyacheslav
#book
https://www.piter.com/collection/new/product/linux-api-ischerpyvayuschee-rukovodstvo
Ostap ꑭ
1248 страниц, исчерпывающее
Berkus
Square
Square
Топ и к тому же хедер-онли
Square
Есть тесты против буста/интела/ и прочих
🐙 Antony
Anonymous
Anonymous
Люблю буст.
🐙 Antony
Berkus
Berkus
🐙 Antony
Square
Square
🐙 Antony
Придётся ставить старенький буст
Berkus
^ реквестирую ревью внимательными глазами
Berkus
я три дня с ним уже ебусь и чот силы кончились
Constantine
У меня есть многопоточный код, я хочу в тестах покрутить-повертеть, что будет в разных вариантах порядка выполнения операций.
Я собираюсь решать это следующим образом: в код выполнения каждого потока я включаю некоторые вызовы, однозначно идентифицирующие место в коде, после чего включить отладочную среду, в рамках которой прохождение этих мест будет синхронизироваться и пропускаться так, как я скажу.
Вопрос А: все уже сделано до меня?
Вопрос Б: я правильно понимаю, что я беру mutex+condition_variable, беру DAG порядка выполнения, после чего узловая точка локает мутекс, записывает что достигнута в DAG, отпускает мутекс, вызывает notify_all, снова локает мутекс и вызывает wait на достижение всех предыдущих узловых в DAG?
Square
У меня есть многопоточный код, я хочу в тестах покрутить-повертеть, что будет в разных вариантах порядка выполнения операций.
Я собираюсь решать это следующим образом: в код выполнения каждого потока я включаю некоторые вызовы, однозначно идентифицирующие место в коде, после чего включить отладочную среду, в рамках которой прохождение этих мест будет синхронизироваться и пропускаться так, как я скажу.
Вопрос А: все уже сделано до меня?
Вопрос Б: я правильно понимаю, что я беру mutex+condition_variable, беру DAG порядка выполнения, после чего узловая точка локает мутекс, записывает что достигнута в DAG, отпускает мутекс, вызывает notify_all, снова локает мутекс и вызывает wait на достижение всех предыдущих узловых в DAG?
Для тестов многопоточного кода возьми relacy или ему подобное
🐙 Antony
^ реквестирую ревью внимательными глазами
Я заметил потенциальный дедлок:
Вот тут вызывается под локом метод, который лочит мьютекс WaitInfo https://gist.github.com/berkus/fddcd55b865e1c24f48009cf380cd992#file-notificationqueue-h-L169
А вот тут https://gist.github.com/berkus/fddcd55b865e1c24f48009cf380cd992#file-notificationqueue-h-L151 сначала лочится WaitInfo, а потом лочится основной мьютекс
Arseny
🐙 Antony
А вот утечку не нашёл
Berkus
А вот утечку не нашёл
волшебным образом умудряется читать из unique_ptr который внутри WaitInfo после того как WaitInto удалился
Berkus
придется почитать ассемблер еще, т.к. при -O0 всё работает, при -O1 падает к хуям
Arseny
Точно?
The iterator first does not need to be dereferenceable if first==last: erasing an empty range is a no-op.
Berkus
Berkus
спасибо, возможно тут и порылась проблема
🐙 Antony
Constantine
я плохо понимаю, кто его удалил из очереди
Constantine
Berkus
Berkus
этот WaitInfo вообще можно на стеке аллоцировать, что я подумываю сделать чтобы в кучу не ходить лишний раз
Constantine
а, я понял
Constantine
там окончание ожидания гарантирует, что он не в очереди
Berkus
да
Constantine
ну да, а во второй ветке, конечно, ошибка в случае таймаута
🐙 Antony
^ реквестирую ревью внимательными глазами
Там точно дедлок:
Поток 1 наичанает выполнять эту строчку https://gist.github.com/berkus/fddcd55b865e1c24f48009cf380cd992#file-notificationqueue-h-L155
Поток 2 вызывает https://gist.github.com/berkus/fddcd55b865e1c24f48009cf380cd992#file-notificationqueue-h-L169
итого
поток 1 держит waiting->cond_mutex_ и пытается залочить mutex_
поток 2 держит mutex_ и пытаетсчя залочить waiting->cond_mutex_
Berkus
Constantine
после чего через atomic выбирать из них элемент и если ты выбираешь 16, то блокируешься и подбираешь следующие 16 из дека
Constantine
видимо, тебе еще будет нужна переменная с текущим состоянием "есть задачи, есть исполнители, нет ничего"
Berkus
Constantine
ну это зависит от
Constantine
вообще я там выше постил вопрос про таймлайнилку
Constantine
кажется, если ты разблокируешь waiting->cond_mutex_ до блокировки основного mutex_, тебе приедет параллельный поток с задачей и выдаст
Constantine
т.е. там нужна будет еще проверка, что задачу не кикнули
Berkus
Berkus
пока что я ничего не пони