并发 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 安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

构建高并发&高可用&安全的IT系统-高并发部分

什么是IT资产?如何保障IT资产安全?

什么是IT资产?如何保障IT资产安全?

如何从内部保障企业数据安全?用IT运维审计系统可以吗?

如何从内部保障企业数据安全?用IT运维审计系统可以吗?

c++ string线程安全吗