c++ - std::vector 与一位读者和一位作者的多线程同步:仅在调整大小时锁定

标签 c++ multithreading c++11 vector concurrency

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

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

然而,我的见解是,只有当特定写入将调整 vector 大小时,这才是绝对必要的,这将导致 realloc,这将导致任何并发读取器的地毯被拉开。在所有其他时间,假设并发读取器未读取当前正在写入的条目,则应允许同时读取和写入 vector 。

因此,我想(以某种方式)仅在我知道我即将执行的写入操作将导致重新分配 vector 的调整大小操作时从写入线程锁定互斥量。

这实用吗?我能否根据capacity 返回的值和当前大小,一定推断下一个push_back 是否会调整大小?

最佳答案

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

您可以使用 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; 
}

我改编了这个例子:

Example for boost shared_mutex (multiple reads/one write)?

希望对你有帮助,如有不妥欢迎指正

关于c++ - std::vector 与一位读者和一位作者的多线程同步:仅在调整大小时锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22542163/

相关文章:

c++ - 关于非聚合结构的初始化

c++ - 按位运算是否解析为常量值

python - Python 的关闭过程设置模块全局变量在哪里记录?

java - 在同步块(synchronized block)中写入 volatile 数组的必要性

c++ - 在库 Arduino 中传递数组

c++ - 使用 std::vecor<char*> 获取 execvp() Linux c++ 的用户输入

multithreading - 具有 2 个线程的全局变量的最小值和最大值

c++ - 如何检查用户输入的内容是否不包含小数?

c++ - 在派生对象上 move 构造函数

c++ - 在多线程环境中使用 std::string 时 Clang 的线程清理器警告