并发 STL it++ 和 *it 安全吗?
Posted
技术标签:
【中文标题】并发 STL it++ 和 *it 安全吗?【英文标题】:Is concurrent STL it++ and *it safe? 【发布时间】: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;
【问题讨论】:
“” 不需要同步。 通常不同的线程对同一个容器有不同的迭代器。但无论如何,迭代器不是线程安全的。 【参考方案1】:如果两个线程使用相同的迭代器(它们共享变量)。在一个线程上阅读并在另一个线程上修改是不安全的。如果每个线程都有自己的迭代器(不同的变量)并且集合没有被修改,这是可以的。您可以从不同的线程中读取列表。但是如果你对容器做任何修改,你就会陷入UB。
【讨论】:
以上是关于并发 STL it++ 和 *it 安全吗?的主要内容,如果未能解决你的问题,请参考以下文章