我有一个向量(一个大的字符串缓冲区),我希望从一个网络线程中读取,而它正在被主线程写入。
由于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(多次读/一次写)的例子?
希望有帮助,如果我错了,请随时纠正我