vector多线程同步,一个读一个写:只在调整大小时锁定
std::vector multithreaded synchronization with one reader and one writer: Only locking when resizing
我有一个向量(一个大的字符串缓冲区),我希望从一个网络线程中读取,而它正在被主线程写入。
由于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(多次读/一次写)的例子?
希望有帮助,如果我错了,请随时纠正我
相关文章:
- 如何按另一个向量的方向调整一个向量?
- 为什么 vector 的方法调整大小会创建一个额外的对象?
- 将函数上调整到基类参数的另一个
- QT4.8嵌入.使用QCursor :: SetPos()调整鼠标输入会导致一个抽搐的光标
- 调整boost :: multi_array匹配另一个
- 如何获得一个窗口,以便在调整C++大小时保留绘制的对象
- 为什么我的 qt centralWidget(一个 QGLWidget)不能正确调整大小?
- 如何在调整大小的std::矢量的最后一个元素后面插入
- Asio:是否有一个可自动调整大小的缓冲区来接收输入
- 如何调整一个非托管的C++DLL以供Ruby使用
- 在一个维度中调整 2D 多边形的大小
- 一个调整任何动态数组大小的函数
- 将jpeg大小从一个缓冲区调整到另一个缓冲区
- 我拖放了一个Table View小部件(Qt).如何在填充元素后调整它的大小
- MFC如何调整CStatic到一个小的大小
- 调整QT中从QWindow继承的另一个类中的事件大小
- 常量时间std::list将大小调整为给定的最后一个元素
- 是否有可能将一个图像放入另一个图像中,并将其大小调整到一定的尺寸
- 如何创建一个可调整大小的Qt缩略图预览
- Qt:调整一个QGraphicsItem (boundingRect())成一个QGraphicsScene与鼠标