Использование Shared_ptr для реализации RCU (чтение-копирование-обновление)?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Использование Shared_ptr для реализации RCU (чтение-копирование-обновление)?

Сообщение Anonymous »

Меня очень интересует RCU в пользовательском пространстве (чтение-копирование-обновление) и попытка смоделировать его через tr1::shared_ptr, вот код, хотя я действительно новичок в параллельном программировании, было бы некоторые эксперты помогут мне сделать обзор?

Основная идея заключается в том, что читатель вызывает get_reading_copy(), чтобы получить указатель текущих защищенных данных (скажем, первого поколения или G1). писатель вызывает get_updating_copy(), чтобы получить копию G1 (скажем, это G2), и только одному писателю разрешено войти в критическую секцию. После завершения обновления функция записи вызывает update(), чтобы выполнить замену и сделать так, чтобы m_data_ptr указывал на данные G2. Текущие считыватели и записывающие устройства теперь владеют общими_ptr(s) G1, и либо читатель, либо записывающий элемент в конечном итоге освободят данные G1.

Любые новые читатели получат указатель на G2, а новый писатель получит копию G2 (скажем, это G3). Возможно, G1 еще не выпущен, поэтому могут сосуществовать несколько поколений данных.

template
class rcu_protected
{
public:
typedef T type;
typedef const T const_type;
typedef std::tr1::shared_ptr rcu_pointer;
typedef std::tr1::shared_ptr rcu_const_pointer;

rcu_protected() : m_is_writing(0),
m_is_swapping(0),
m_data_ptr (new type())
{}

rcu_const_pointer get_reading_copy ()
{
spin_until_eq (m_is_swapping, 0);

return m_data_ptr;
}

rcu_pointer get_updating_copy ()
{
spin_until_eq (m_is_swapping, 0);

while (!CAS (m_is_writing, 0, 1))
{/* do sleep for back-off when exceeding maximum retry times */}

rcu_pointer new_data_ptr(new type(*m_data_ptr));

// as spin_until_eq does not have memory barrier protection,
// we need to place a read barrier to protect the loading of
// new_data_ptr not to be re-ordered before its construction
_ReadBarrier();

return new_data_ptr;
}

void update (rcu_pointer new_data_ptr)
{
while (!CAS (m_is_swapping, 0, 1))
{}

m_data_ptr.swap (new_data_ptr);

// as spin_until_eq does not have memory barrier protection,
// we need to place a write barrier to protect the assignments of
// m_is_writing/m_is_swapping be re-ordered bofore the swapping
_WriteBarrier();

m_is_writing = 0;
m_is_swapping = 0;
}

private:
volatile long m_is_writing;
volatile long m_is_swapping;
rcu_pointer m_data_ptr;
};


Подробнее здесь: https://stackoverflow.com/questions/282 ... opy-update
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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