我有一个 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/