Golang中国

go在处理多groutine之间共享数据时,建议用channel传递数据,但是我有一个场景不知道如何实现比较合适: 简单起见,主程序维护一个map[string] bool,接收外界请求,用于判断一个string是否在内存中,同时另一个groutine则实时监控一个文件,一旦这个文件有修改,则将文件内容全部更新到map中。

按照c/c++的实现方式是,建立2个线程,一个相应请求,一个实时判断文件更新,并加载数据,然后用一个指针进行原子切换。

那么,在go中如何实现这个功能更适合go的风格?

谢谢

9 回复
Bluek404
#1 Bluek404 • 2014-11-17 13:09

可以创建一个chan string

然后监控线程监控到变更往里面塞一个string

主线程用switch接收chan的信息就行

接收到后往map添加

astrophor
#2 astrophor • 2014-11-17 13:16

我理解你的意思是不是说监控groutine用于监控文件变化,一旦发现变化,监控协程通知主协程,由主协程更新map?

这样的话,主协程就要完成 更新map和查询map 2个工作,导致这2个事情无法同时进行。

我的想法是主协程完成查询map工作,由监控协程完成加载新的map,但是怎么将监控协程中的map数据告诉给主协程,不知道有没有什么比较好的办法

stevewang
#3 stevewang • 2014-11-17 14:01

其实你直接用mutex来做就可以,不需要用channel。

astrophor
#4 astrophor • 2014-11-17 14:31

那就是说直接多groutine之间共享内存就行,通过mutex来保证一致性,是么

stevewang
#5 stevewang • 2014-11-17 15:19

David
#6 David • 2014-11-17 15:24

如果速度要求很高的话,最好用sync/atomic写成 lock-free 的。

astrophor
#7 astrophor • 2014-11-17 16:06

好的,是我想多了,多谢各位

itfanr
#8 itfanr • 2016-03-21 10:17

@astrophor
@stevewang

golang里面有没有pthread_cond_signal、phtread_cond_wait这样的函数?

cond弥补了mutex的什么不足?

xianyu90
#9 xianyu90 • 2016-03-21 11:49

Golang爱好者技术交流 185521558,欢迎新手入群交流

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。