并发STL it ++和*它安全吗?

时间:2018-01-24 09:02:39

标签: c++ stl iterator thread-safety

给定在单个编写器线程中创建的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;

1 个答案:

答案 0 :(得分:2)

如果两个线程都使用相同的迭代器(它们共享变量)。在一个线程上读取它并在另一个线程中修改是不安全的。如果每个线程都有自己的迭代器(不同的变量)并且没有修改集合,那就没问题。您可以从不同的线程中读取列表。但是如果你对容器进行任何修改,你就属于UB。