Изменяет ли потокобезопасность другого значения поля в boost multi_index

У меня есть:

struct employee
{
  uint64_t id;
  uint32_t a;
  uint32_t b;

  employee() { }

  struct By_id {};
  struct By_a {};
  struct By_b {};

  struct Change_a : public std::unary_function< employee, void >
  {
    uint32_t p;
    Change_a(const uint32_t &_p) : p(_p) {}
    void operator()(employee & r) { r.a = p; }
  };  

  struct Change_b : public std::unary_function< employee, void >
  {
    uint32_t p;
    Change_a(const uint32_t &_p) : p(_p) {}
    void operator()(employee & r) { r.b = p; }
  };   
};

typedef multi_index_container<
  employee,
  indexed_by<
    ordered_unique< tag<employee::By_id>, member<employee, uint64_t, &employee::id> >,
    ordered_non_unique< tag<employee::By_a>, member<employee, uint32_t, &employee::a> >,
    ordered_non_unique< tag<employee::By_b>, member<employee, uint32_t, &employee::b> >,
    >
> employee_set;

employee_set es;

typedef employee_set::index<employee::By_id>::type List_id;
typedef employee_set::index<employee::By_a>::type List_a;
typedef employee_set::index<employee::By_b>::type List_b;

//...
thread 1
List_id::iterator it_id;
es.modify( it_id, employee::Change_a( 0 ) );
thread 2
List_id::iterator it_id;
es.modify( it_id, employee::Change_b( 0 ) );
//...

Этот стандартный пример работы с мультииндексным контейнером boost. если найти какой-то узел по id и сохранить итератор в List_id::iterator it_id;

Я хочу изменить (изменить) разные поля сотрудника в разных потоках.

Являются ли параллельные операции потокобезопасными?


person IronFil    schedule 24.04.2014    source источник


Ответы (1)


Boost.MultiIndex имеет те же базовые гарантии безопасности потоков, что и другие контейнеры в стандартной библиотеке:

  • Параллельный доступ только для чтения в порядке.
  • Параллельный доступ для записи должен быть внешне синхронизирован пользователем (вами).

Таким образом, вызовы modify (или любые другие операции, приводящие к изменениям в контейнере) должны быть защищены каким-либо механизмом, подобным мьютексам.

person Joaquín M López Muñoz    schedule 28.04.2014