草庐IT

并发无锁的艺术

全部标签

go - 实现并发的失败尝试

我很难让go并发正常工作。我正在处理从XML数据源加载的数据。将数据加载到内存后,我循环遍历XML元素并执行操作。加并发前的代码已经过测试,可以正常使用,我认为不会对加并发有任何影响。我有2次失败的并发实现尝试,两次都具有不同的输出。我使用锁定是因为我不想进入竞争状态。对于这个实现,它永远不会进入goroutine。varmusync.Mutex//lengthis197Kfori:=0;i对于此使用waitGroups的实现,发生运行时内存不足varmusync.Mutexvarwgsync.WaitGroup//lengthis197Kfori:=0;i我不太确定发生了什么,需要一

go http.Request.Conn.ActiveConn是一个map,那么会不会有并发map的问题呢?

去http.Request.Context.ActiveConn是一个map,会不会有并发map问题?如果有很多连接,我打印包含ActiveConn(map)的request.Context,会不会有并发读写map的问题?packagemainimport("fmt""net/http")funcmain(){http.HandleFunc("/",func(whttp.ResponseWriter,r*http.Request){fmt.Fprintf(w,"r.ctx:%#v,%+v",r.Context(),r.Context())})http.ListenAndServe(":

concurrency - 为什么并发写入的boolean值设置为false后还是true?

我正在用Go编写哲学家用餐解决方案。我的解决方案很简单:检查两个fork是否可用。如果是这样,请同时选择两者。如果不是,请保留两者。但是,我遇到了一个奇怪的并发错误,即使在明确设置为false之后,fork的可用性仍然是true。我的Fork声明如下:typeForkstruct{musync.Mutexavailbool}func(f*Fork)PickUp()bool{f.mu.Lock()iff.avail==false{f.mu.Unlock()returnfalse}f.avail=falsefmt.Println("setfalse")f.mu.Unlock()return

concurrency - 使用并发的 Golang 流水线

Go新手。我正在尝试编写一个“流水线”,其中多个函数像worker一样工作,并在流水线中将一些数据结构传递给彼此,每个函数都对数据结构做一些事情。typeorderStructstruct{orderNum,capacityintorderCodeuint64box[9]int}funcposition0(inchanorderStruct){order:=>63==1){order.box[order.capacity]=1order.capacity+=1}fmt.Println("fillingbox{",order.orderNum,order.orderCode,order.

go - golang 是否可以接受优雅的关闭写入并发模式?

我刚开始在go中使用并发。我有其他语言的并发经验,如果你试图写入一个封闭的channel,go会引发panic,这让我感到难过。这种模式会非常有用,因为您可以解耦参与者的生命周期并使它们独立。这使您不必同步清理它们。本质上,我可以让读取器在关闭之前关闭channel,并通知任意数量的写入器并通过channel上的写入错误停止阻塞(取消)。因此我编写了一个通用函数来处理这种形式的消息传递:///Sendsamessagetoaremotegeneralchannel.///Returnstrueifthemessagewassent(thesendstoppedblocking)orfa

Go 并发 : Chudnovky's algorithm, 比同步慢

最近在friend的推荐下开始学习围棋。到目前为止,我很喜欢它,但我写了(我认为会是)轻量级并发的完美示例,并得到了令人惊讶的结果......所以我怀疑我做错了什么,或者我是误解了goroutines的成本。我希望这里的一些gophers可以提供见解。我使用goroutines和简单的同步执行在Go中编写了Chudnovsky的算法。我假设,每个计算都独立于其他计算,同时运行至少会快一点。注意:我在第5代i7上运行它,所以如果goroutine像我被告知的那样被多路复用到线程上,这应该是并发的和并行的。packagemainimport("fmt""math""strconv""tim

go - golang 中带有嵌入式锁的通用结构集合

下面是一个嵌入另一个结构的示例。我试图弄清楚如何传递更具体的结构指针以存储在不太具体的结构指针中。您可以将其视为一个集合。包装在接口(interface)中似乎不起作用,因为这样做会制作副本,这对带锁的结构无效。想法?packagestackoverflowimport"sync"typeCoolerThingWithLockstruct{fancyStuffstringThingWithLock}funcNewCoolerThingWithLock()*CoolerThingWithLock{coolerThingWithLock:=&CoolerThingWithLock{}coo

尽管有锁,Go 仍检测到 map 上的并发读写

我正在编写一个简单的缓存机制,它有一个Add、一个Evict和一个Search方法。Search目前尚未实现,因此无需担心。调用Add添加数据的goroutine数量较多,只有一个goroutine运行在evict循环中逐出数据。一旦我对它施加一些严重的流量,Go就会抛出并说在mapmetricCache上有并发的读写访问,但我看不出这是怎么发生的,因为它周围有锁。我正在使用Go1.7。文件mdata/cache.go:57:funcNewCCache()*CCache{58:cc:=&CCache{59:lock:sync.RWMutex{},60:metricCache:make(

Golang 单 channel 并发和阻塞,需要解释

我正在研究https://tour.golang.org/concurrency/5上提供的代码.我的想法是,我可以通过摆脱退出channel来简化代码,同时仍然保持正确的程序行为-仅用于学习目的。这是我得到的代码(为了更好的可读性进一步简化了它):packagemainimport"fmt"import"time"funcsendNumbers(cchanint){fori:=0;i在这段代码中,我生成的go例程在返回之前应该能够接收到2个数字。我接下来调用的sendNumbers()函数将恰好2个数字发送到channelc。因此,程序的预期输出是2行:0和1。但是,当我在页面上运行

parsing - 在 Go 中并发解析二进制文件中的记录

我有一个要解析的二进制文件。该文件被分解为每条1024字节的记录。所需的高级步骤是:一次从文件中读取1024个字节。解析每个1024字节的“记录”(block)并将解析的数据放入映射或结构中。将解析后的数据和任何错误返回给用户。我不是在寻找代码,只是在寻找设计/方法方面的帮助。由于I/O限制,我认为尝试从文件中并发读取没有意义。但是,我看不出为什么不能使用goroutine解析1024字节的记录,以便同时解析多个1024字节的记录。我是Go的新手,所以我想看看这是否有意义,或者是否有更好(更快)的方法:主函数打开文件并一次将1024个字节读入字节数组(记录)。记录被传递给一个函数,该函