![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
народ
проверьте пжалста - нигде я тут не напортачил
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
в хипе переменные размещать не обязательно можно использовать ф-ию InterlockedPointerExchange, в которую передавать сразу, указатель на нод Добавлено через 5 минут и 6 секунд в классе mpsc_queue
это race condition, здесь нужно использовать CAS алгоритм должен быть такой создаем новый нод tmp, далее пытаемся указатель на него записать в tail, если tail не изменился за время создания нода, то продолжаем работать. если изменился, то заново получаем указатель на tail и опять пытаемся присвоить туда указатель на новый нод, как-то так а у тебя в коде нигде не используется InterlockedCompareExchange, без этого lock-free queue реализовать невозможно |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
спасибо за информацию - потом поправлю но прежде всего проверьте логику Добавлено через 7 минут и 7 секунд вы не совсем поняли логику создается овый нод, после чего атомарно берется текущий хвост (помещается в tmp) и указаталь на хвост заменяется новым нодом если в этот момент произойдет повторный вход в push, то следующий нод будет рисоединен к этому в любом случае |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
вот как я это вижу
ты прав, должно работать Добавлено через 4 минуты и 48 секунд вроде-бы ничего не смущает, должно работать |
||||
|
|||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
мне кажется возможным такой вариант, первый поток входит в push, изменяет tail_ и сохраняет его старое значение в tmp второй поток входит в push и делает то-же самое, изменяет tail_ и сохраняет в tmp значение которое туда записал другой поток первый поток просыпается и записывает в tmp->next новое значение tail_, а не то, которое он туда установил второй поток просыпается и записывает в свой tmp->next (tmp - нод созданый первым потоком, на который никто не указывает в данный момент) указатель на tail_ (тот-же tail_ что и у первого потока) в результате - утечка памяти Это сообщение отредактировал(а) Lazin - 8.4.2009, 23:20 |
||||
|
|||||
| J0ker |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
о блин точно непрально выразил мысль должно быть так:
|
||||||||
|
|||||||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
так будет работать, никаких проблем я не вижу Добавлено через 2 минуты и 28 секунд хотя. можно сделать и mpmc_queue tbb::concurrent_queue позволяет читать и записывать многим потокам одновременно, может не стоит изобретать свой вид транспрота а использовать threading building blocks? |
||||
|
|||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
да, возможно добавлю - пока мне это не актуально
это я смотрел во-первых коммерческая лицензия у них 300 баксов а во-вторых у них очередь локирующая - они мотивируют это тем, что во-первых такой нагрузки на очередь, что-бы лак сказывался на производительности все равно не бывает, т.к. очереди обычно присутствуют там, где есть IO; а во-вторых у консьюмера все равно будет либо беспробудный пулинг, либо нужен сторонний механизм нотификации, который сам по себе меет всегда локирующую природу они, конечно, правы, но мне больше нравятся красивые решения, а не красивые отмазки Это сообщение отредактировал(а) J0ker - 9.4.2009, 15:50 |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
в коммерческих проектах можно использовать и бесплатную версию, к тому-же 300$ не особо крупная сумма Добавлено через 1 минуту и 32 секунды
просто там намного больше возможностей (к примеру определение размера очереди), но если эти возможности не нужны, то можно вполне обойтись и "красивым" решением |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |