![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
http://cppjournal.blogspot.com/
Здесь есть статья про lock_free программирование. Для асинхронного удаления элемента используются весьма сложные конструкции. Я вижу решение таким. Довольно просто, и эффективно. Но, может bыть я что-то недопонимаю, и на самом деле здесь bаги? неbольшой тест LWS
Это сообщение отредактировал(а) Леопольд - 28.11.2010, 01:22 -------------------- вопросов больше чем ответов |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Вроде bы раbотает, даже если сперва запустить потоки, которые выкидывают элементы из стека...
Это сообщение отредактировал(а) Леопольд - 28.11.2010, 01:56 -------------------- вопросов больше чем ответов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
там их несколько. о какой именно идет речь? второе - есть либа relacy. о ней тоже говорится в третьей статье. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Леопольд
Ну для начала скажу, что тут есть проблемы не только с очисткой памяти, здесь не предусмотрен pop() на пустом стеке. Что касается проблемы очистки памяти, опишу ситуацию. В стеке 10 элементов, 2 потока одновременно выполняют pop().
1 поток выполняет все строчки до 4-ой. Выполняет конструкцию while (!m_head.compare_exchange_weak(old_head, old_head->next)); compare_exchange_weak возвращает false, т.е. ожидается еще одна итерация и поток передает управеление другому потоку 2 поток входит в pop(), выполняет все действия, удаляет head (так-как old_head != &end), возвращает значение и передает управление 1-ому потоку. 1 поток пытается выполнить еще одну итерацию в цикле while (!m_head.compare_exchange_weak(old_head, old_head->next)); но old_head указывает на удаленную область памяти и old_head->next - обращение к ней, что ведет за собой неопределенное поведение. И еще .. пользя от функции size() здесь довольно сомнительная. По сути она возвращает программисту размер, который когда-то точно был размером этого стека, не более. Это сообщение отредактировал(а) azesmcar - 28.11.2010, 07:04 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Отвлекся..вернемся к делу
http://liveworkspace.org/code/b6e8617b670b...85227a2cb07ea49 всего лишь несколько последовательных запусков и... вообще непонятен смысл этой статической переменной, в ее роли мог бы выступать 0, и не надо было бы проверять при удалении. boostcoder Ну разве что для логирования может сгодиться, другого применения я не вижу
Такой тест придется запускать ни один раз, чтобы проверить работоспособность. Лучше использовать правда придется немного модифицировать код, но эта жертва, на которую стоит пойти Это сообщение отредактировал(а) azesmcar - 28.11.2010, 07:56 |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Это "для сеbя", надо разоbраться с relacy, а это время.
Для этого end и нужна. Она зацикливает конец списка на сеbя. Это сообщение отредактировал(а) Леопольд - 28.11.2010, 11:50 -------------------- вопросов больше чем ответов |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Полегчало? Лучший спосоb разоbраться - сделать свой, возможно уbогий, вариант. Это сообщение отредактировал(а) Леопольд - 28.11.2010, 10:23 -------------------- вопросов больше чем ответов |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
поbорол при помощи статического указателя (только это уже не lock_free, а wait_free):
Рельна ли ситуация, когда поток подменил указатель и внезапно умер, не завершив раbоту? Если да, то bудет deadlock. Это сообщение отредактировал(а) Леопольд - 28.11.2010, 23:00 -------------------- вопросов больше чем ответов |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А в чем замысел? Почему compare_exchange заменен на if и exchange?
Вообще комментарии бы не помешали, не знаю будет работать или нет, детально не смотрел, но насколько я понял и эта работа в холостую по сути лишает преимущества перед блокировками. дедлока тут по определению быть не может. Дедлок может возникнуть только при блокировании, а тут нет блокирования. Это сообщение отредактировал(а) azesmcar - 30.11.2010, 10:49 |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
compare_exchange сложнее читать, он неинтуитивно записывает новое значение атомарной переменной по ссылке в первый аргумент. Это сообщение отредактировал(а) Леопольд - 28.11.2010, 17:37 -------------------- вопросов больше чем ответов |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
spin lock - тоже lock, но в user-mode и никак не может быть wait-free. wait-free функция означает, что любой поток, начавший выполнять эту функцию закончит выполнение за N-ое количество шагов, и N никак не зависит от других потоков.
Там слишком мало информации, это всего лишь базовые сведения, если интересует тема могу подкинуть литературу, но только на английском. Это сообщение отредактировал(а) azesmcar - 28.11.2010, 17:22 |
|||
|
||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Не откажусь от ссылок на признанных авторов в данной теме. Спасиbо! Английский даже лучше, иногда перевод тяжелее понять. Добавлено @ 17:35
Это сообщение отредактировал(а) Леопольд - 28.11.2010, 18:07 -------------------- вопросов больше чем ответов |
||||
|
|||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Получается, что compare_exchange тот же spin lock.
-------------------- вопросов больше чем ответов |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |