vector多线程同步,一个读一个写:只在调整大小时锁定



我有一个向量(一个大的字符串缓冲区),我希望从一个网络线程中读取,而它正在被主线程写入。

由于vector不是线程安全的,典型的方法是锁定两个线程对它的访问。

然而,我的见解是,只有当特定的写操作将重新调整向量的大小时,这才应该是严格必要的,这将导致realloc,这将导致任何并发读取器的地毯被拉紧。在其他任何时候,只要并发读取器没有读取当前正在写入的数据项,就应该允许对vector的读写同时发生。

所以,我想(以某种方式)只有当我知道我将要做的写操作将导致重新分配向量的大小操作时,才会从写线程锁定互斥锁。

这可行吗?我可以根据capacity返回的值和当前大小来推断,对于某些,下一个push_back是否会调整大小?

我假设您正在通过执行push_back写入向量

你可以使用boost shared_mutex,允许你有多个读和一个写。

vector<string> vBuffer;
boost::shared_mutex _access;
void reader()
{
  // get shared access
  boost::shared_lock<boost::shared_mutex> lock(_access);
  // now we have shared access
}
void writer(int index, const string& data)
{
  // get upgradable access
  boost::upgrade_lock<boost::shared_mutex> lock(_access);
  if (vBuffer.capacity()<=index)//test here you can saefly write
  {
      // get exclusive access
      boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
      // now we have exclusive access
      vBuffer.resize(vBuffer.2);
  }
  vBuffer[i]=data; 
}

我改编了这个例子:

boost shared_mutex(多次读/一次写)的例子?

希望有帮助,如果我错了,请随时纠正我

最新更新