GO协程之间如何共享一个状态变量?

yoorxee 2019-01-11 03:48:05
背景:main 为主进程,启动4个go线程(a、b、c、d);
a、b、c线程在执行某任务的时候,判断变量status是否=1,=1则阻塞当前任务
d线程每隔10分钟,判断变量status是否=0,是的话 执行某个任务,设置为1,完成后设置为0
相当于共享一个实时变量,能读写
...全文
1310 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2019-03-07
  • 打赏
  • 举报
回复
一个协程在监听 变量变化, 有变化就通知其他协程
伟洪winni 2019-03-06
  • 打赏
  • 举报
回复
全局变量 + 锁
szqh97 2019-03-05
  • 打赏
  • 举报
回复
import 进来后定义 个全局变量来使
oyljerry 2019-01-19
  • 打赏
  • 举报
回复
直接作为参数把共享状态传进各个协程
yoorxee 2019-01-14
  • 打赏
  • 举报
回复
引用 1 楼 nuczzz 的回复:
说两个概念你应该自己就能写出来了: 1.闭包 示例代码: func main() { a := 1 go fun(){ a ++ }() select{} } 说明: main函数里定义了一个变量a,新起的goroutine中并没有定义变量a但却可以直接使用a,这就是一个闭包的使用。根据你说描述的背景,你可以定义一个a, b c, d四个goroutine都可以访问到的变量(使用闭包),建议类型定义为int32/uint32/int64/uint64,原因:与第二个概念有关。 2.原子操作atmoic 原子操作由系统保证变量线程安全性,效率比锁快,具体可自行查阅相关资料。在你给出的背景中,推荐使用CAS(compare and swap)操作 atomic.CompareAndSwapInt32 atomic.CompareAndSwapUint32 atomic.CompareAndSwapInt64 atomic.CompareAndSwapUint64 atomic包为标准库包:sync/atomic 如果你对上述两个概念有所掌握,相信自己写出来是分分钟的事情。
这个我是知道的,问题我那个方法是 import 进来的,不在main里实现
	go func(task_status []int) {
		sm.Tsp(task_status) //这里是import进来的,怎么实时共享啊
		fmt.Println("aaa",fornum)
		for v := range c {
			fornum++
			fmt.Println("go1,",v)
		}
		wg.Done()
	}(task_status)
nuczzz 2019-01-13
  • 打赏
  • 举报
回复
说两个概念你应该自己就能写出来了: 1.闭包 示例代码: func main() { a := 1 go fun(){ a ++ }() select{} } 说明: main函数里定义了一个变量a,新起的goroutine中并没有定义变量a但却可以直接使用a,这就是一个闭包的使用。根据你说描述的背景,你可以定义一个a, b c, d四个goroutine都可以访问到的变量(使用闭包),建议类型定义为int32/uint32/int64/uint64,原因:与第二个概念有关。 2.原子操作atmoic 原子操作由系统保证变量线程安全性,效率比锁快,具体可自行查阅相关资料。在你给出的背景中,推荐使用CAS(compare and swap)操作 atomic.CompareAndSwapInt32 atomic.CompareAndSwapUint32 atomic.CompareAndSwapInt64 atomic.CompareAndSwapUint64 atomic包为标准库包:sync/atomic 如果你对上述两个概念有所掌握,相信自己写出来是分分钟的事情。

2,348

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • 俺叫西西弗斯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧