LINUX.ORG.RU

Кому-нибудь нужна еще одна либа с реализацией spinlock-ов для C++11?

 ,


2

3

У меня внутри одного проекта валяется, по-сути, полностью автономная, header-only библиотека с реализацией single-reader/single-writer и multi-reader/single-writer спинлоков: spinlocks.hpp

Базируется она на информации из документации к стандартной библиотеке C++11, идеях Дмитрия Вьюкова (так же известного как remark, одного из ведущих разработчиков Thread Sanitizer, невероятно крутого гуру в области многопоточности), исходных текстов LLVM и libcds. Собственно, код rw_spinlock, это калька с реализации аналогичного спинлока Димы из LLVM.

Так вот, если у кого-то будет интерес, то можно будет выделить spinlocks.hpp в отдельный подпроект, снабдить его примерами, более развернутой документаций. И публиковать ее релизы и дистрибутивы как релизы самостоятельного проекта. Получится такая легковесная библиотека со spinlock-ами, базирующаяся только на стандартной библиотеке C++11, без дополнительных внешних зависимостей.

Интересно/нужно это кому-то?

Если интересно или нужно, то какое имя будет подходить этой библиотеке? Например, stdcxx_spinlocks/stdcxx_spins/cxx11_spinlocks/cxxspinlocks?

★★★★★

Последнее исправление: beastie (всего исправлений: 1)

Ответ на: комментарий от eao197

Интересно, почему по этому пути не пошли разработчики LLVM?

интересно, почему ты это спрашиваешь у меня?

Вариант с платформенно-зависимым кодом внутри .hpp показался более сложным и дорогим при сопровождении

use namespace, Luke

Но, если выложить это как автономную библиотеку, то может быть кому-то будет интересно улучшать и развивать это дальше.

нечего там «улучшать и развивать». это не решается в user-space.

anonymous
()
Ответ на: комментарий от anonymous

за исключением той же проблемы, что и на cplusplusreference

Что же это за проблема? Или это тайные знания, которые вам достались по наследству и понаследству же и будут переданы, но никуда за пределы семьи не уйдут?

и кучи ненужного кода

Где там эта куча?

то что ты подсовывешь по дефолту — порнография.

Еще раз для тимлидеров. Это не общеупотребительная библиотека. Это частное решение частной проблемы в частном проекте. Поэтому по дефолту используется именно такой backoff, т.к. busy waiting был не нужен.

тоже есть сомнение что не сольёт стандартным реализациям.

Ваши сомнения пусть выслушивают ваши подчиненные. Им за это деньги платят. Здесь вы сказали «лучше», извольте продемонстрировать. Особенно на сценариях, для которых этот тип rw_lock-а работает хорошо.

Например, если есть несколько сотен тысяч уникальных объектов, нуждающихся в защите. И всего несколько десятков нитей, которые каким-то случайным образом обращаются к этим объектам и вероятность одновременного доступа к объекту из разных нитей весьма низкая.

и ни одна из них не может быть решена в user-space приемлемым образом.

Походу, я общаюсь с тимлидом-теоретиком.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

то что ты подсовывешь по дефолту — порнография

Да ладно: http://msdn.microsoft.com/en-us/library/dd997366(v=vs.110).aspx «SpinLock may yield the time slice of the thread even if it has not yet acquired the lock» (с) Тимлиды моралофажат пока им не пригреет жеппу манагер и дедлайн.

anonymous
()
Ответ на: комментарий от anonymous

интересно, почему ты это спрашиваешь у меня?

Чтобы задумался хоть о чем-то, прежде чем писать.

use namespace, Luke

До namespace нужно будет еще overuse #if/#else. А без лишней на то необходимости желания бабахаться с разными сочетаниями платформ/компиляторов нет.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

ещё один пионер покукарекать пришёл?

mutex можно реализовать тремя разными lock-ами: spin-lock (крутиться в user-space до посинения), sleep-lock (то что ты цитируешь, но разница в том, что ты при этом просишь ядро ОС разбудить тебя ровно один раз когда блокировка освободиться — в этом заключается отличие от костылей, которые ты можешь попробовать навелосипедить в user-space) и adaptive-lock (сначала открутить N циклов спина — N зависит от стоимости переключения контекста на данной платформе, а потом изобразить из себя sleep-lock).

в linux и *bsd mutex == adaptive-lock, в windows mutex == sleep-lock, а CriticalSection == adaptive-lock.

anonymous
()
Ответ на: комментарий от eao197

Что же это за проблема? Или это тайные знания, которые вам достались по наследству и понаследству же и будут переданы, но никуда за пределы семьи не уйдут?

test-set — плохо, надо test-test-set. возьми уже в руки книжку, наконец.

Здесь вы сказали «лучше», извольте продемонстрировать.

ты попросил высказать моё квалифицированное мнение. ты его получил. с чего ты взял, что можешь что-то ещё от меня требовать? ты мне за это деньги не платишь, заметь.

Особенно на сценариях, для которых этот тип rw_lock-а работает хорошо.

он нигде не работает хорошо.

вероятность одновременного доступа к объекту из разных нитей весьма низкая

spin-lock, очевидно же.

anonymous
()
Ответ на: комментарий от anonymous

ты попросил высказать моё квалифицированное мнение. ты его получил.

Я получил набор высокопарных и наукообразных слов. Если это и есть мнение, то да, оно реально квалифицированное.

с чего ты взял, что можешь что-то ещё от меня требовать?

Из наивного предположения, что специалисты, обычно, могут чем-то подкрепить свои слова.

ты мне за это деньги не платишь, заметь.

Было бы за что.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

test-set — плохо, надо test-test-set. возьми уже в руки книжку, наконец.

«Although this optimization is useful in system programming it should be avoided in high level concurrent programming unless all constraints are clear and understood.» Wiki.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

high level... ну и если !(clear and understood) то лучше и не претендовать на то, что это библиотека, которой кто-то может захотеть пользоваться, не правда ли?

anonymous
()
Ответ на: комментарий от anonymous

Какая-то добрая душа уже стерла кучу очень содержательных сообщений. Похоже, вы собираетесь сформировать новую.

Код написан на C++. Если можете что-то дельное сказать по этому поводу, то скажите. Мне интересно.

eao197 ★★★★★
() автор топика
Ответ на: не душа, а модератор. потёр флуд. от anonymous

у тебя опять зачесалось желание поспорить и похамить?

Очень бы хотелось узнать у вас:

* есть ли претензии к С++ коду? В частности, выше вы обмолвились «и кучи ненужного кода», но указать где увидели эту кучу не смогли.

* в коде какого проекта можно увидеть вашу реализацию rw_lock-а? Это Linux, FreeBSD, Mozilla, Chromium, какая-то реализация стандарта Posix, что-то еще?

Сможете дать вменяемые ответы на эти два вопроса или продолжите свой обычный стиль общения?

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

ты же сам постил пример реализации spin-lock-а без «кучи ненужного кода»...

rw-lock в user-space? ты в своём уме?

anonymous
()
Ответ на: комментарий от anonymous

Ни одного вменяемого ответа не получено, код не продемонстрирован, декларируемая вами квалификация ничем не подтверждена.

Найдите, пожалуйста, для своих испражнений какую-нибудь другую тему.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

Ни одного вменяемого ответа не получено

ты получил много ответов, но не в состоянии их понять

код не продемонстрирован

фетишизмом в этой теме занимаешься только ты

квалификация ничем не подтверждена

ты считаешь, что я нуждаюсь в твоём подтверждении?

anonymous
()
Ответ на: комментарий от anonymous

ты считаешь, что я нуждаюсь в твоём подтверждении?

Мне безразлично, в чем нуждаетесь вы лично. Но, поскольку в данной теме вы пытаетесь показать себя экспертом, то было бы полезно узнать, на чем базируется ваша самоуверенность.

А посему «Talk is cheap. Show me the code» (с)

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

если кто-то комментирует твой "код", он должен предоставить список выполненных проектов с примерами кода?

ты не только некомпетентен, но ещё и неадекватен.

anonymous
()

если кто-то комментирует твой «код», он должен предоставить список выполненных проектов с примерами кода?

Если это анонимный тимлидер-эксперт, утверждавший, что его реализация rw_lock-а используется в каком-то OpenSource проекте, но не признающийся где именно, то да.

Посему, «Talk is cheap. Show me the code» (с).

eao197 ★★★★★
() автор топика

Автор, никого не слушай, ты молодец

Захотел поделиться с сообществом - делись, ты молодец, например, как здесь посоветовали.

// Лично мне на данный момент сабж не нужен, но вдруг завтра понадобится?

hobbit ★★★★★
()
Ответ на: Автор, никого не слушай, ты молодец от hobbit

Я надумал код спинлоков вынести в отдельную либу, но по другой причине: в общем проекте уж слишком задалбывает прогон тестов для спинлоков. Заодно заменю test-and-set на test-test-and-set и добавлю, как минимум, еще один готовый тип backoff-a.

eao197 ★★★★★
() автор топика
Ответ на: Если это анонимный... от anonymous

я думаю, у тебя бомбит по другой причине.

Ну, если я кругом не прав и у меня какой-то неправильный spinlock с backoff-ом, то, пожалуйста, поясните одну штуку.

Вот сделан бенчмарк для проверки производительности разных вариантов spinlock-ов. Там создается несколько нитей, каждая из которых делает N итераций обработки вектора целых чисел. Сначала каждый элемент вектора увеличивается на единицу, модифицированные значения суммируются. Затем все элементы вектора обнуляются. Каждая итерация происходит при захваченном spinlock-е. Т.е. имитируется некоторая задачка на обработку данных в ОП.

Так вот, почему-то spinlock с yeild_backoff-ом показывает меньшее время работы, чем spinlock с busy_waiting_backoff-ом. Причем так оказывается и когда в векторе много элементов (т.е. spinlock захватывается надолго), и когда мало (т.е. spinlock захватывается на короткое время):

bash-3.1$ _vc_12_0_x64/release/_test.cppinlock.bench_vector_sum.exe -i 500000 -v 2048
default_spinlock on 2 threads: 2.735s
busy_waiting_spinlock on 2 threads: 3.235s
===
default_spinlock on 4 threads: 7.069s
busy_waiting_spinlock on 4 threads: 9.464s
===
default_spinlock on 8 threads: 14.398s
busy_waiting_spinlock on 8 threads: 39.524s
===
bash-3.1$ _vc_12_0_x64/release/_test.cppinlock.bench_vector_sum.exe -i 500000 -v 32
default_spinlock on 2 threads: 0.076s
busy_waiting_spinlock on 2 threads: 0.077s
===
default_spinlock on 4 threads: 0.144s
busy_waiting_spinlock on 4 threads: 0.2s
===
default_spinlock on 8 threads: 0.288s
busy_waiting_spinlock on 8 threads: 0.97s
===
Здесь показаны результаты с 4-х ядерной машины под Win8.1 и VisualC++ 2013. Там же под MinGW-w64 (GCC 4.9.1) получается аналогичная картина.

Обновленный вариант spinlock-а, который работает по схеме test-test-and-set лежит здесь.

Собственно вопрос: почему на этом примере не срабатывает ваша логика и busy-waiting spinlock проигрывает spinlock-у с обращением к yeild-у?

eao197 ★★★★★
() автор топика

Собственно, тема закрыта. Работы над библиотекой прекращены из-за отсутствия должной квалификации и времени на ее приобретение.

Все результаты экспериментов лежат вот в этой ветке Svn-репозитория.

Если кому-то интересны подробности, то вот здесь.

Всем спасибо за участие в обсуждении.

eao197 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.