Алгоритмы без блокировки не имеют проблемы с тупиками, но это не композиционно. Требуется для разработки 2 или более контейнеров в качестве единой составленной структуры данных без блокировки.
Есть ли какой-либо подход, вспомогательный внедрение или некоторые алгоритмы без блокировки-до Работайте с несколькими беззакоренными контейнерами, чтобы поддерживать последовательность? > [*] Перемещать элемент из одного контейнера в другой атомно [/b]
...
Или RCU или поставщики опасностей могут помочь сделать это? (CDS) Библиотека: http://libcds.sourceforge.net/doc/cds-a ... __map.html твою > упорядоченная карта, например, cds-lib < /p>
, но даже простой алгоритм без блокировки не является без блокировки для любых случаев: < /p>
- итераторы < /strong> документация-link < /li>
< /ol>
Вы можете обратиться к установленным элементам Skip-list только под замок RCU . Только в
в этом случае итератор является защитным потоком, поскольку в то время как RCU заблокирован любой элемент
set не может быть восстановлен. Требование блокировки RCU во время
итерационное означает, что удаление элементов (то есть стирание) не является
поссибель. 2 ">
[/b] - Documentation -linkКод: Выделить всё
::contains(K const &key)
- to [/b] и элемент обновления, который мы получили, мы должны использовать lock : документация-link
Код: Выделить всё
::get(K const &key)
Код: Выделить всё
typedef cds::container::SkipListMap< cds::urcu::gc< cds::urcu::general_buffered >, int, foo, my_traits > skip_list;
skip_list theList;
// ...
typename skip_list::raw_ptr pVal;
{
// Lock RCU
skip_list::rcu_lock lock;
pVal = theList.get( 5 );
if ( pVal ) {
// Deal with pVal
//...
}
}
// You can manually release pVal after RCU-locked section
pVal.release();
< /code>
, но если мы используем 2 контейнера без блокировки вместо 1, и если мы используем только методы, которые всегда без блокировки, или один из них без блокировки, тогда мы можем это сделать не блокируя оба контейнера? < /p>
typedef cds::urcu::gc< cds::urcu::general_buffered > rcu_gpb;
cds::container::SkipListMap< rcu_gpb, int, int > map_1;
cds::container::SkipListMap< rcu_gpb, int, int > map_2;
что другие потоки не видят, что в первом контейнере нет элемента, и он до сих пор не появлялся во втором < /p>
< /li>
что другое потоки не видят, что в первом контейнере есть элемент, и тот же элемент уже во втором < /p>
< /li>
< /ul>
Можем ли мы Сделайте что -нибудь атомно с 2 или более контейнерами без блокировки, не блокируя оба - если мы хотим поддерживать атомность и последовательность? Атомно-атомные операции с двумя или более бесплатными контейнерами без блокировки, используя просто обычные функции. Для 2 контейнеров без блокировки достаточно 1 блокировки, исключите 3 случая, описанные выше, если даже в контейнерах без блокировки используются замки. Если вы сделали сложные пользовательские улучшения алгоритмов без блокировки, то вы можете предоставить некоторые композиционные, например, как «две очереди знают друг о друге, и код, который смотрит на них, тщательно спроектирован», как отметил Питер Кордес.
Подробнее здесь: https://stackoverflow.com/questions/388 ... hout-locki
Мобильная версия