【发布时间】:2018-01-24 09:02:38
【问题描述】:
给定在单个编写器线程中创建的双向迭代器 it,递增迭代器 it++ 或分配它 it = list.begin() 并同时让一个或多个读取器线程使用 *it 取消引用它是否安全?
PS:通过首先检查std::next(it),it++ 将不会变成list.end()。
//
// 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;
【问题讨论】:
-
“并发 STL it++ 和 *it 安全吗?” 不需要同步。
-
通常不同的线程对同一个容器有不同的迭代器。但无论如何,迭代器不是线程安全的。
标签: c++ stl iterator thread-safety