我知道,一般来说,C++ STL 不能保证读写的线程安全。
如果 vector 不会调整大小,并且读写区域不会重叠怎么办?
下面的代码有问题吗? (保证数据永远不会超过v的保留长度)
class Foo {
public:
Foo(){
v.reserve(99999);
startWriter();
startReader();
}
void startWriter() {
std::thread t([&](){
while (true) {
if (auto message = bar.recieve(); !message.is_empty()) {
v.push_back(message.value());
}
}
});
t.detach();
}
void startReader() {
std::thread t([&](){
int last_idx = 0;
while (true) {
int new_idx = v.size();
for (int i = last_idx; i < new_idx; ++i) {
v2.push_back(v[i]);
}
last_idx = new_idx;
sleep(3);
}
});
t.detach();
}
private:
vector<int> v;
vector<int> v2;
Bar bar;
}
或者我需要v = vector<int>(99999);
并使用v[actual_size++] = message.value();
相反?
或者这两种方法都不是线程安全的?
感谢您的回答。
最佳答案
当谈到线程时,你并没有真正绕过它。如果代码不明确,显然是线程安全的,那么就将其视为不安全。
说到标准库,就很清楚了。 push_back
是一个修改函数。该调用与从其他线程作用于该对象的任何其他调用之间必须存在适当的同步;否则,会发生数据争用。
再多的储备
也不会改变这一点。
关于c++ - 保留 vector 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76116473/