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?

★★★★★

Например, stdcxx_spinlocks/stdcxx_spins/cxx11_spinlocks/cxxspinlocks?

jafslock (от «just another faked spinlock» типа того, а то их настолько дохрена что варианты со spin и std уже заезжаны)

MKuznetsov ★★★★★ ()

Вы реализовали идею и выложили для рецензии на Лор? Бесплатные консультации психолога...

По существу, можно создать на GitHub-е eao197/cpplib и туда складывать, например cpplib/sync/spinlocks.hpp. Кому - надо найдёт, воспользовавшись поиском. Имхо, самый нормальный вариант.

backbone ★★★★★ ()

если оно реально норм, то можно попробовать пихнуть в буст lockfree же. Правда придется что то думать про компили без C++11, либо заменить этой реализацией что то из буста.

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

Когда мне понадобились spinlock-и, то выяснилось, что ничего маленького, без лишних зависимостей и под BSD-like лицензий ничего-то и нет. Самый толковый вариант был libcds, но даже без этого хотелось обойтись.

Собственно вопрос в том, а кто-нибудь еще сталкивался с тем, что ему нужна простая функциональность spinlock-ов без необходимости тянуть к себе в проект Boost или что-то подобное? Если сталкивался, то можно потратить время и оформить отдельную header-only библиотеку. Если никому это не нужно, то можно не париться и потратить это же время на что-то другое.

Добавлять что-то в Boost нет желание. Мне не нравится Boost ни как задумка, ни как явление. Да и как там народ код пишет тоже не нравится. Имхо, сейчас и без меня полно желающих чего-нибудь в Boost засунуть.

eao197 ★★★★★ ()

Мне не нужно, так что не оформляй.

anonymous ()
class yield_backoff_t
// ....
				std::this_thread::yield();
// ....
				while( m_flag.test_and_set( std::memory_order_acquire ) )
					backoff();
// ....
typedef spinlock_t< yield_backoff_t > default_spinlock_t;

аффтар. купи себе книжку многопоточность для чайников

/thread

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

Cпинлоки — это шаблоны, которые параметризуются классом backoff и вы сами можете написать себе любой вариант backoff-а. Может вам книжку по C++ прочитать?

eao197 ★★★★★ ()

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

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

Я думал, что найдется хотя бы два-три вменяемых читателя форума, которые на вопрос интересно/нужно ответят «да», вместо того, чтобы писать херню.

Вариант «скинь на github» очевиден.

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

Выкладывание проекта в публичный доступ — это взятие на себя некоторых обязательств. Нужно оформить библиотеку во что-то вменяемое, снабдить ее примерами, описаниями, хорошими справочником по API. Затем как-то реагировать на вопросы, bug report-ы и feature request-ы от пользователей, если таковые возникнут.

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

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

Не хочу сказать, что твоя либа говно, но ты немного преувеличиваешь ее значение. Кидай на гитхаб, будут появляться вопросы или вообще какая-нибудь активность — напишешь доку. Ну две с половиной строчки кода, ей б-гу.

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

ты немного преувеличиваешь ее значение

Я пытаюсь понять ее значение. Когда мне нужна была реализация srsw- и mrsw-spinlock-ов, то я не нашел ничего маленького, кросс-платформенного с BSD-like лицензией. Отсюда появился мой код.

Вот мне и интересно, сталкивался ли еще кто-то с такой же ситуацией. Или же никому это не нужно (spinlock-и либо не используются, либо есть в какой-то либо, либо пишутся ручками)?

Кидай на гитхаб, будут появляться вопросы или вообще какая-нибудь активность — напишешь доку.

Не, это не мой вариант. Хоть какую-то планку нужно держать.

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

выложив на гитхаб простыню кода с сопроводительным текстом README.md из первого сообщения, в случае нужности проекта ты получишь issues с просьбами добавить документацию или патчи. А сдесь бы просто скинул ссыль.

Deleted ()

оффтоп. расскажи плиз, как ты пришел к такому кодстайл: зачем отступ перед { и на след строке сразу второй? Почему в блоке if отступа перед { нет, а в блоке while есть?

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Я перепробовал много стилей оформления кода и могу писать в разных. Отступ перед открывающей фигурной скобкой был когда-то подсмотрен в стандартах GNU. Сначала он казался мне неудачным, но когда-то потребовалось писать много классов-шаблонов с мелкими методами, оказалось, что в таком стиле затем код воспринимается намного лучше.

Что до скобочек в if-е, то это, видимо, случайность. Во время отладки код модифицировался, при очередной правке, походу, форматирование в этом месте сбилось.

eao197 ★★★★★ ()

Ура! Джва года ждал такой либы!!!

автыр, а чем оно отличает от примера из книжки «C++ Concurrency in Action Practical Multithreading»?

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

Почему оно должно отличаться?

Когда в многопоточном коде вам нужен spinlock, то вы ссылку на страницу в печатном издании книги в код вставляете?

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

милый, у меня работа такая -- крестовый код читать

был бы я царём — сказал бы, что ты написал «тормозное говно» (это является объективной истиной), но я — интеллигентный анонимус и посоветовал тебе знакомиться с предметом, в котором ты ничего не понимаешь, не «идеи», а литературу. когда поймёшь зачем придумали спинлоки (заодно узнаешь, что приличные люди много лет назад отказались от их использования), тогда можешь попробовать написать ещё что-нибудь.

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

Я пытаюсь понять ее значение.

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

Прямо сейчас ты делаешь все то же самое: публикуешь код с минимальной докой и пытаешься получить фидбек. Фидбек от куда меньшей аудитории в сравнении с гитхабом.

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

пробую

но чаще стираю шедевры типа того что в заглавном посте, ещё больше приходится читать

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

Это не попытка получить фидбек. Это маркетинговое исследование :)

Результаты которого пока показывают, что нет смысла париться. У меня работает, мне этого достаточно. Кому потребуется что-то подобное, тот скопипастит из Уильямса :)

eao197 ★★★★★ ()
Ответ на: пробую от anonymous

пробую

Т.е. деньги своим трудом в качестве программиста пока еще не зарабатываете?

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

я на C++ программирую.

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

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

это очень спорное утверждение

Ух ты, а развернуть тезис могешь?

eao197 ★★★★★ ()
Ответ на: толсто от anonymous

толсто
попробуй ещё

Так ты программизмом зарабатываешь или нет?

Где это работа состоит в чтении плюсового кода? Преподаватель в ВУЗе? Или аспирант, которому в качестве учебной нагрузке дали ведение лабораторных по C++?

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

тимлид? не, не слышал.

и это хорошо... хм, для тебя. если бы он у тебя был, то уже написал бы докладную записку с требованием уволить тебя по причине профнепригодности. в качестве обоснования вполне сойдут первые 50 строк твоей портянки (дальше мне лень было смотреть, но подозреваю, что там всё ещё печальнее). она ярко демонстрирует полное непонимание предмета как с теоретической, так и с практической стороны.

anonymous ()
Ответ на: не за что, приходи ещё... от anonymous

Ну коль мне повезло пообщаться с таким гуру, то интересно было бы услышать ваше мнение о качестве вот этих решений и уровне профессионализма их авторов:

1. Вариант простейшегого спинлока на основе std::atomic_flag из документации к стандартной библиотеке C++: вот здесь.

2. Вариант multi-reader/single-writer спинлока из кода проекта LLVM: вот здесь.

Буду очень признателен за науку.

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

1. будет тормозить по сравнению с нормальной реализацией (+1 строка), но чтобы объяснить школьникам суть — вполне сойдёт. надеюсь, ты понимаешь, что твой код делает совсем не это.

2.

// Simple reader-writer spin-mutex. Optimized for not-so-contended case.
// Readers have preference, can possibly starvate writers.
автор сам признаёт, что это — ментальный онанизм. реализация rw-lock-ов в любой современной ОС значительно лучше.

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

1. будет тормозить по сравнению с нормальной реализацией (+1 строка), но чтобы объяснить школьникам суть — вполне сойдёт. надеюсь, ты понимаешь, что твой код делает совсем не это.

Нет, не понимаю. Не вижу разницы между кодом из документации и моим.

// Simple reader-writer spin-mutex. Optimized for not-so-contended case.
// Readers have preference, can possibly starvate writers.
автор сам признаёт, что это — ментальный онанизм.

Как из описания особенностей реализации следует, что это «ментальный онанизм»? Есть реализация, есть такие особенности, если это подходит под задачу, то в чем проблема?

реализация rw-lock-ов в любой современной ОС значительно лучше.

Есть объективные тесты? Или это авторитетное мнение анонимного тимлидера?

eao197 ★★★★★ ()

http://jade-lang.com/
Мне думается, что реализации данного компилятора (template engine) на C++ в качестве lib (static/shared), будет популярнее. Я бы даже денег заплатил, если вы бы выложили на гитхаб в последствии.

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

Это далеко от сферы моих интересов. Собственно, как и спинлоки. Просто спинлоки понадобились, а ничего, чтобы не тащило за собой что-то большое, при беглом поиске не обнаружилось.

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

1. не понимаешь потому, что у тебя очень плохо с теорией; я бы сказал неотличимо от нуля с точностью до бесконечно малых величин. если бы ты знал зачем когда-то давно использовали спинлок, то понял бы, что твоя реализация не имеет с этими идеями ничего общего.

2. потому что «Optimized for not-so-contended case» и «can possibly starvate writers». т.е. не решает как раз те задачи, для которых придумали rw-lock-и.

3. тесты чего, если «Optimized for not-so-contended case»?

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

Что-нибудь более конкретное, кроме общих слов про теорию можно сказать?

Например, вы утверждаете, что в качестве простейшего спинлока реализация из документации к стандартной библиотеке C++ вполне рабочая. Не самая быстрая, но рабочая.

Если в моем коде определить:

struct null_backoff { inline void operator()() {} };
using busy_waiting_spinlock = spinlock_t< null_backoff >;
то чем это будет отличаться от кода простейшего спинлока?

По поводу тестов «чего». Вы сказали, что «реализация rw-lock-ов в любой современной ОС значительно лучше». Если реализация лучше, то это может быть объективно показано сравнением разных вариантов по каким-то критериям. Соответственно, поскольку верить вашему авторитетному мнению у меня нет никаких оснований, то хотелось бы видеть какое-то объективное подтверждение «лучше».

Как я понял, вы придерживаетесь мнения, что rw_lock-и, которые обеспечивают «честное» ожидание читателей и писателей на объекте синхронизации, лучше, чем те, что не обеспечивают «честного» ожидания. Правильно?

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

libpthread? win32 api?

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

или ты без сишного рантайма собираешься?

У меня не было задачи сделать самую лучшую библиотеку для спинлоков. Нужно было что-то простое, быстро и без лишних зависимостей. Вариант с платформенно-зависимым кодом внутри .hpp показался более сложным и дорогим при сопровождении (когда таковое потребуется).

Собственно, вопрос об интересе к такой библиотеке возник потому, что я своих целей достиг. Но, если выложить это как автономную библиотеку, то может быть кому-то будет интересно улучшать и развивать это дальше. В том числе реализуя более сложные варианты алгоритмов блокировок (например, обеспечивая «честное» ожидание для читателей/писателей, гарантировать, что захват объекта рано или поздно произойдет, разблокировать объект при завершении нити, если он остался заблокированным), предоставляя разные реализации backoff-ов, используя платформенно-зависимые вещи и т.д.

Если это никому не интересно, то нет смысла этим заниматься. Мне же пока с головой хватает того, что уже есть.

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

1. это — не отличается (за исключением той же проблемы, что и на cplusplusreference и кучи ненужного кода). то что ты подсовывешь по дефолту — порнография. спинлоки нужны (тоже для случай «not-so-contended») потому, что переключаться в ядро и назад — дорого.

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

3. кроме «честного» (а лучше — настраиваемого) способа передачи управления, есть ещё одна, не менее важная: http://en.wikipedia.org/wiki/Thundering_herd_problem . и ни одна из них не может быть решена в user-space приемлемым образом.

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