给定在单个编写器线程中创建的BidirectionalIterator it
,增加迭代器it++
或分配它it = list.begin()
是否安全,同时有一个或多个读取器线程取消引用它与*it
?
PS:首先检查it++
,list.end()
将不会成为std::next(it)
。
//
// initialization (writer thread)
//
std::list<int> list;
for(int i=0; i<1000; i++)
list.push_back(i);
auto it = list.begin();
//
// writer thread:
//
auto nextit = std::next(it);
if(nextit == list.end())
nextit = list.begin();
*nextit = newval();
it = nextit;
//
// reader thread(s)
//
auto & val = *it;
std::cout << val << std::endl;
答案 0 :(得分:2)
如果两个线程都使用相同的迭代器(它们共享变量)。在一个线程上读取它并在另一个线程中修改是不安全的。如果每个线程都有自己的迭代器(不同的变量)并且没有修改集合,那就没问题。您可以从不同的线程中读取列表。但是如果你对容器进行任何修改,你就属于UB。