如何使用boost :: thread mutex来同步写访问?

Fra*_*ank 4 multithreading mutex boost-thread

关于Boost::Thread和我有一个新手问题Mutex.

我想启动以下的许多并行实例Worker,并且所有这些实例都写相同std::vector:

struct Worker {
  std::vector<double>* vec;
  Worker(std::vector<double>* v) : vec(v) {}
  void operator() {
    // do some long computation and then add results to *vec, e.g.
    for(std::size_t i = 0; i < vec->size(); ++i) {
      (*vec)[i] += some_value;
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

我明白工人必须vec在写入之前锁定并在完成时将其解锁(因为所有工人都写入相同的向量).但是我该怎么表达呢?

nos*_*nos 8

你需要一个boost :: mutex来保护向量,你可以使用boost :: mutex :: scoped_lock来锁定构造函数中的互斥锁,并在析构函数中解锁它

请记住,您需要在访问该实例的任何位置使用相同的互斥锁,无论vec是读取还是写入.

为了让你前进,你可以做以下事情:

struct Worker {
  boost::mutex &vec_mutex;

  Worker(std::vector<double>* v,boost::mutex &v_mutex) : vec(v),vec_mutex(v_mutex) {}
  void operator() {        
    // do some long computation and then add results to *vec, e.g.

    boost::mutex::scoped_lock lock(vec_mutex);
    for(std::size_t i = 0; i < vec->size(); ++i) {
      (*vec)[i] += some_value;
    }
  }

};
Run Code Online (Sandbox Code Playgroud)

对于更高级的东西,你应该进一步封装vector和mutex,或者迟早你会忘记这些需要连接,你可以访问vec某个地方而不需要锁定导致很难调试问题.对于这个例子的问题,我宁愿让工人使用他们自己的单独的向量,并在工人完成时将结果组合在一个控制线程中.