Можем ли мы сделать что-нибудь атомно с 2 или более контейнерами без блокировки, не блокируя оба?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можем ли мы сделать что-нибудь атомно с 2 или более контейнерами без блокировки, не блокируя оба?

Сообщение Anonymous »

Я ищу композиционные операции - это довольно легко выполнять с помощью транзакционной памяти. (Благодаря AMI Tavory) P>
Алгоритмы без блокировки не имеют проблемы с тупиками, но это не композиционно. Требуется для разработки 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 ">

    Код: Выделить всё

    ::contains(K const &key)
    [/b] - Documentation -link
Функция применяется внутри блокировки RCU. < /blockquote>
  • to

    Код: Выделить всё

    ::get(K const &key)
    [/b] и элемент обновления, который мы получили, мы должны использовать lock : документация-link
Пример : < /p>

Код: Выделить всё

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;
Можно ли атомно перемещать 1 элемент из map_1 to map_2 без блокировки оба контейнера - то есть map_1.erase (k const & key) и map_2.insert (k const & key, v const & val) Если мы хотим поддерживать атомность и согласованность:


что другие потоки не видят, что в первом контейнере нет элемента, и он до сих пор не появлялся во втором < /p>
< /li>
что другое потоки не видят, что в первом контейнере есть элемент, и тот же элемент уже во втором < /p>
< /li>
< /ul>
Можем ли мы Сделайте что -нибудь атомно с 2 или более контейнерами без блокировки, не блокируя оба - если мы хотим поддерживать атомность и последовательность? Атомно-атомные операции с двумя или более бесплатными контейнерами без блокировки, используя просто обычные функции. Для 2 контейнеров без блокировки достаточно 1 блокировки, исключите 3 случая, описанные выше, если даже в контейнерах без блокировки используются замки. Если вы сделали сложные пользовательские улучшения алгоритмов без блокировки, то вы можете предоставить некоторые композиционные, например, как «две очереди знают друг о друге, и код, который смотрит на них, тщательно спроектирован», как отметил Питер Кордес.


Подробнее здесь: https://stackoverflow.com/questions/388 ... hout-locki
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»