【问题标题】:Does modify different field value thread safe in boost multi_index是否在 boost multi_index 中修改不同的字段值线程安全
【发布时间】:2014-04-24 09:32:20
【问题描述】:

我有:

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 多索引容器。 if 通过 id 找到某个节点并将迭代器存储在 List_id::iterator it_id;

我想在不同线程中更改(修改)员工的不同字段。

并发操作是线程安全的吗?

【问题讨论】:

    标签: boost thread-safety multi-index


    【解决方案1】:

    Boost.MultiIndex 与标准库中的其他容器具有相同的非常基本的线程安全保证:

    • 并发只读访问正常。
    • 并发写访问必须由用户(您)在外部同步。

    因此,对modify 的调用(或任何其他导致容器发生变化的操作)必须使用某种类似互斥锁的机制进行保护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2016-07-27
      相关资源
      最近更新 更多