C++ 是并发STL it++;安全吗?

C++ 是并发STL it++;安全吗?,c++,stl,iterator,thread-safety,C++,Stl,Iterator,Thread Safety,给定在单个编写器线程中创建的双向迭代器it,增加迭代器it++或分配它it=list.begin(),同时让一个或多个读卡器线程用*it解除对它的引用是否安全 PS:it++将通过首先选中std::next(it)来保护它不成为list.end() // //初始化(写入线程) // std::列表; 对于(int i=0;i如果两个线程使用相同的迭代器(它们共享变量)。在一个线程上读取它并在另一个线程中修改是不安全的。如果每个线程都有自己的迭代器(不同的变量)并且集合没有被修改,这是可以的。您

给定在单个编写器线程中创建的双向迭代器
it
,增加迭代器
it++
或分配它
it=list.begin()
,同时让一个或多个读卡器线程用
*it
解除对它的引用是否安全

PS:
it++
将通过首先选中
std::next(it)
来保护它不成为
list.end()

//
//初始化(写入线程)
//
std::列表;

对于(int i=0;i如果两个线程使用相同的迭代器(它们共享变量)。在一个线程上读取它并在另一个线程中修改是不安全的。如果每个线程都有自己的迭代器(不同的变量)并且集合没有被修改,这是可以的。您可以从不同的线程读取列表。但是如果您对容器进行任何修改,您将陷入UB。

“并发STL it++和*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;