map find 是线程安全的吗

测试环境gcc4.8.2

?
?

iterator find ( const key_type& k );

const_iterator find ( const key_type& k ) const;

?
?

Unordered_map有两个对应的find函数 我推断第二个是安全的,第一个经过实测不是线程安全

?
?

auto iter = _map.find(key)

在openmp多线程环境下出core,感谢glog的错误信息输出

?
?

***?Aborted?at?1412933723?(unix?time)?try?"[email protected]"?if?you?are?using?GNU?date?***

PC:[email protected]???????????0x8d1d65?std::equal_to<>::operator()()

***?SIGSEGV?(@0x8)?received?by?PID?3216?(TID?0x7f7c3902d700)?from?PID?8;?stack?trace:?***

[email protected]?????0x7f7c4b769150?(unknown)

[email protected]???????????0x8d1d65?std::equal_to<>::operator()()

[email protected]???????????0x8e231b?std::__detail::_Equal_helper<>::_S_equals()

[email protected]???????????0x8dbbb0?std::__detail::_Hashtable_base<>::_M_equals()

[email protected]???????????0x8d1e63?std::_Hashtable<>::_M_find_before_node()

[email protected]???????????0x8c432e?std::_Hashtable<>::_M_find_node()

[email protected]???????????0x8b2bca?std::_Hashtable<>::find()

[email protected]???????????0x89adcd?std::unordered_map<>::find()

[email protected]???????????0x87af21?gezi::LruMap<>::find()

[email protected]???????????0x85c6ab?gezi::TimerMap<>::count()

[email protected]???????????0x7ee705?run()

[email protected]???????????0x7f1893?_Z3runv._omp_fn.3

[email protected]?????0x7f7c4a65641a?gomp_thread_start

[email protected]?????0x7f7c4b7611c1?start_thread

[email protected]?????0x7f7c49b6c0ad?__clone

Segmentation?fault

?
?

?
?

由于我可能需要修改iter->second,因此不能改用const_iterator

增加

iterator iter;

#pragma omp critical

iter = _map.find(key);

?
?

程序运行正常了

时间: 2024-08-02 23:19:39

map find 是线程安全的吗的相关文章

关于List Map Set的线程安全的问题

常见的ArrayList  LinkedList  HashMap TreeMap LinkedHashMap HashSet TreeSet LinkedHashSet 都是线程不安全的.如果要使用线程安全的,可以使用: 1.List  -----   Vector   .ConcurrentLinkedQueue 2.Map -----   Hashtable   .ConcurrentHashMap 3.Set  ------   ConcurrentSkipListSet 4.使用Col

map线程

来看看map线程到底是如何运行的 很早就知道一个map是一个线程,以后有可能改成一个map一个进程,那就先来看看一个map一个线程是如何运作的 其实刚开始整个服务器就是两个线程,但发现这样服务器支持的人数不多,其实我是刚来具体不太清楚到底咋回事,也没有网络进程,最开始就是将GameMap从GameServer中分离出去,单独一个模块 经理说将GameServer相当于一个总闸的作用,相关的map相关的动作放到GameMap里面去做 NEW(Map); class Map : public Map

Python并发编程之线程池/进程池--concurrent.futures模块

h2 { color: #fff; background-color: #f7af0d; padding: 3px; margin: 10px 0px } 一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的线程池/进程池,以空间换时间.但从Python3.2开始,标准库为我们提供了conc

简单的Map缓存机制实现

简单的Map缓存机制实现 大致思路是用一个单例的Map实现,当然此Map得是线程安全的--ConcurrentHashMap 原本项目需求是缓存十条消息,所以打算用Map实现缓存机制.中途夭折下面具体尚未实现... 当然此代码仞为半成品,具体得根据项目需求采用不同的原则清除缓存 package per.zww.util; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class CacheP

MapReduce核心map reduce shuffle (spill sort partition merge)详解

Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序.如果你不知道MapReduce里 Shuffle是什么,那么请看这张图: 这张是官方对Shuffle过程的描述.但我可以肯定的 是,单从这张图你基本不可能明白Shuffle的过程,因为它与事实相差挺多

【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源

线程安全一直是程序员们关注的焦点.多线程也一直是比較让人头疼的话题,想必大家以前也遇到过各种各种的问题.我就不再累述了.当然,解决方案也有非常多,这篇博文给大家提供一种非常好的解决线程安全问题的思路. 首先.我们先简单的认识一下ThreadLocal,之后是实例+解析,最后一句话总结. 1.认识一下ThreaLocal 认识ThreadLocal必需要通过api文档,不只具有说服力,并且它会给你更加全面的解释.以下我我给大家从api文档上截取一张图,并标出来了七点需要重点理解的内容,实例过后的解

Java集合篇四:Map的基本应用

package com.test.collection; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; //Map的基本应用 public class MapTest { /** * @param args */ public static void main(String[] args) { /*

JAVA Map集合类简介

了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试· Oracle JDeveloper 10g java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 List 和 Map.List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建.存储和操作任何类型对象元素列表.List 适用于按数值索引访问元素的情形. Map 提供了一个更通用的

Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类

1.线程范围内共享变量 1.1 前奏: 使用一个Map来实现线程范围内共享变量 public class ThreadScopeShareData { static Map<Thread, Integer> dataMap = new HashMap<Thread, Integer>(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable