草庐IT

concurrent_unordered_multimap

全部标签

c++ - std::unordered_map 是如何实现的

c++unordered_mapcollisionhandling,resizeandrehash这是我之前提出的一个问题,我发现我对unordered_map的实现方式有很多困惑。我相信很多其他人也和我一样困惑。根据我没有阅读标准就知道的信息:Everyunordered_mapimplementationstoresalinkedlisttoexternalnodesinthearrayofbuckets...No,thatisnotatallthemostefficientwaytoimplementahashmapformostcommonuses.Unfortunately,

c++ - hash_map 和 unordered_map 的区别?

最近发现C++中hashmap的实现会叫unordered_map。当我查看他们为什么不只是使用hash_map时,我发现显然hash_map的实现存在兼容性问题,即unordered_map解析(更多关于它here)。那个wiki页面没有提供更多信息,所以我想知道是否有人知道unordered_map解决的hash_map的一些问题。 最佳答案 由于C++标准库中没有定义哈希表,标准库的不同实现者会提供一个非标准的哈希表,通常命名为hash_map。因为这些实现不是按照标准编写的,所以它们在功能和性能保证方面都有细微的差别。从C+

c++ - C++ std::unordered_map 中使用的默认哈希函数是什么?

我正在使用unordered_map和unordered_map每种情况下使用什么哈希函数,每种情况下发生冲突的可能性是多少?我将在每种情况下分别插入唯一字符串和唯一int作为键。我有兴趣了解字符串和int键的哈希函数算法及其冲突统计信息。 最佳答案 函数对象std::hash被使用了。标准特化适用于所有内置类型,以及一些其他标准库类型如std::string和std::thread.查看完整列表的链接。对于要在std::unordered_map中使用的其他类型,你必须专攻std::hash或创建自己的函数对象。冲突的可能性完全取

concurrency - Golang 并发数组访问

当每个goroutine在一个slice上工作时,从多个goroutine访问同一个数组是否安全,指向同一个底层数组但不重叠?喜欢:vararr[100]intsliceA:=arr[:50]sliceB:=arr[50:]goWorkOn(sliceA)goWorkOn(sliceB)想象一下“WorkOn”会做一些花哨的事情。 最佳答案 只要保证区域不重叠就可以了。保证我的意思是:谁在sliceA上工作,应该不被允许做sliceA=append(sliceA,a,b,c)。因为那样它就会开始进入sliceB的领域。此处相关的是G

concurrency - 我们应该做嵌套的 goroutines 吗?

我正在尝试为大量文件构建解析器,但我找不到可能称为“嵌套goroutines”的信息(也许这不是正确的名称?)。给定很多文件,每个文件都有很多行。我应该这样做:forfileinfolder:godo1defdo1:forlineinfile:godo2defdo2:do_something或者我应该只使用“一个级别”的goroutine,并执行以下操作:forfileinfolder:forlineinfile:godo_something我的问题主要针对性能问题。感谢您说出那句话! 最佳答案 如果您使用您指定的架构,您很有可能会

concurrency - 在 Golang 中同时读取多个 channel

我是Golang的新手。现在我正在尝试弄清楚如何在Golang中创建一个任意对一的channel,其中设置如下:假设我有两个goroutinenumgen1和numgen2同时执行并将数字分别写入channelnum1。编号2。我想在一个新进程addnum中添加从numgen1和numgen2发送的数字。我尝试过这样的事情:funcaddnum(num1,num2,sumchanint){done:=make(chanbool)gofunc(){n1:=但这似乎很不正确。有人可以给我一些想法吗?非常感谢您的帮助。 最佳答案 根据您的

concurrency - 是否可以将多个 channel 复用为一个?

这个想法是在一个slice中拥有可变数量的channel,将通过它们接收到的每个值推送到单个channel中,并在最后一个输入channel关闭后关闭此输出channel。像这样,但对于两个以上的channel:funcmultiplex(cin1,cin2,coutchanint){n:=2for{select{casev,ok:=上面的代码避免了忙循环,因为没有default情况,这很好(编辑:看起来“,ok”的存在使得选择语句非阻塞,循环是毕竟很忙。但是为了这个例子,把代码想象成它会阻塞)。是否也可以通过任意数量的输入channel来实现相同的功能?显然,这可以通过将slice成

concurrency - Go 中生产者/消费者最简洁的成语是什么?

我想做的是拥有一组生产者goroutine(其中一些可能完成也可能不完成)和一个消费者例程。问题在于括号中的警告-我们不知道将返回答案的总数。所以我想做的是:packagemainimport("fmt""math/rand")funcproducer(cchanint){//Mayormaynotproduce.success:=rand.Float32()>0.5ifsuccess{c所以问题是,如果我关闭它是错误的,如果我不关闭它仍然是错误的(参见代码中的注释)。现在,解决方案将是一个带外信号channel,所有生产者都写入:packagemainimport("fmt""mat

concurrency - 我什么时候应该在 Go 中使用并发?

那么除了处理多个服务器请求之外,还有其他时间与并发相关吗?我问是因为它是如此内置于语言中,如果我不使用它,我会觉得很浪费,但我几乎找不到它的用途。 最佳答案 (还)不是Go方面的专家,但我想说:只要最容易这样做。Go中并发模型的美妙之处在于,它从根本上不是一个多核架构,它在事情通常会中断的地方进行检查和平衡——它是一种多线程范式,不仅非常适合在多核架构中,它也非常适合分布式系统架构。您不必为多个goroutines进行特殊安排就可以和谐地协同工作-他们就是这样做的!这是一个自然并发算法的示例-我想将多个channel合并为一个。一旦

concurrency - 在 Go 中分配指针是原子的吗?

在Go中分配指针是原子的吗?我需要在锁中分配一个指针吗?假设我只想将指针分配给nil,并希望其他线程能够看到它。我知道在Java中我们可以为此使用volatile,但Go中没有volatile。 最佳答案 在go中唯一保证是原子的就是sync.atomic中的操作。.所以如果你想确定你要么需要锁,例如sync.Mutex或使用原子原语之一。我不建议使用原子原语,因为您必须在使用指针的任何地方都使用它们,而且它们很难正确使用。使用互斥锁是可以的——你可以定义一个函数来很容易地返回当前指针并锁定,例如import"sync"varsec