-
Notifications
You must be signed in to change notification settings - Fork 359
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cache aware queue for multiple producers-consumers #49
Conversation
How to use this queue? Where is any test?
What is the meaning of |
|
Как я понимаю, это попытка реализовать вот этот интересный алгоритм: http://www.par.univie.ac.at/project/peppher/publications/Published/opodis10lfq.pdf Оригинальный алгоритм CAQueue существенно полагается на свойства Gidenstam SMR, в частности, на reference counting, и не может быть реализован в терминах защиты только локальных ссылок, то есть в терминах Hazard Pointer. Вполне допускаю, что вам удалось модифицировать оригинальный алгоритм и сделать его пригодным для использования вовсе без каких-то специальных схем вроде Hazard Pointer и т.п. Но это нужно доказать. Для меня доказательством будет прохождение всех multi-threaded тестов очередей. Насчет accessor. IMO, это надуманный класс, делающий данную очередь несовместимой с интерфейсом других алгоритмов очередей. В оригинальной статье говорится о thread-local storage, именно так и надо этот алгоритм реализовывать. Так как C++11 STL не содержит абстракции TLS, можно взять реализацию boost - http://www.boost.org/doc/libs/1_60_0/doc/html/thread/thread_local_storage.html. Тогда все "детали реализации" в виде accessor уйдут внутрь методов enqueue/dequeue и CAQueue станет по интерфейсу совершенно такой же, как и остальные очереди в libcds. А это значит, что специальных тестов для неё не придется писать, следует просто подключить её в уже существующие. И наконец |
|
|
подумав ещё, прихожу к выводу, что подход с accessor интересен, - не надо возиться с TLS, тем самым можно ожидать какой-то performance бонус. |
cmake без проблем собирает на master вместе с тестами cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=DEBUG -DWITH_TESTS=ON |
У меня не собирается: |
Какая версия boost? |
1.59 |
Это бага в boost 1.59. |
Реализовал вариант с boost::thread_specific_ptr, теперь интерфейс совместимый, добавил тесты |
Good work! Осталось две небольшие мелочи:
Memory leaks: ==2657==ERROR: LeakSanitizer: detected memory leaks Direct leak of 1600000 byte(s) in 100000 object(s) allocated from: Direct leak of 1600000 byte(s) in 100000 object(s) allocated from: Direct leak of 1600000 byte(s) in 100000 object(s) allocated from: Direct leak of 1600000 byte(s) in 100000 object(s) allocated from: SUMMARY: AddressSanitizer: 6400000 byte(s) leaked in 400000 allocation(s). |
ThreadSanitizer обнаруживает гонки: info.head / info.tail должны быть atomic |
После проверки объектов и операций над ними попадающих под подозрения на гонки данных, гонок как таковых не обнаружил. Предупреждения связаны с CAS алгоритмикой. |
Это был мой курсач =) |
Во, пошла дискуссия, это хорошо ;-) |
I will try to make an intrusive version, if I understand how it should be implemented.
May need to change the interface of the container, and to make it richer.