我有一个向量(一个大的字符串缓冲区),我希望在主线程写入时从网络线程读取。
由于vector
不是线程安全的,因此典型的方法是从两个线程锁定对它的访问。
然而,我的见解是,当特定的写入将调整向量的大小时,这应该是严格必要的,这将导致重新分配,这将导致任何并发读者将他们的地毯拉出来。在所有其他时间,如果并发读取器没有读取当前正在写入的条目,则应允许同时读取和写入向量。
所以,我想(以某种方式)只在我知道我要执行的写操作会导致重新分配向量的调整大小操作时,只从写线程锁定互斥锁。
这是实用的吗?我可以根据capacity
返回的值和当前大小推断,某些是否会调整下一个push_back
?
答案 0 :(得分:1)
我假设您通过执行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;
}
我改编了这个例子:
Example for boost shared_mutex (multiple reads/one write)?
希望有帮助,如果我错了,请随时纠正我