Gox语言中使用读写锁解决并发冲突以及如何实现线程同步归并-GX22

Gox语言中,除了可以直接使用Go语言中的通道对象(chan)之外,也直接引入了Go语言标准库中的sync包,因此可以直接使用共享锁Mutex对象或者读写锁RWMutex对象来处理并发操作中共享数据安全的问题。同时,也可以使用sync包中的WaitGroup对象来实现几个并发线程间的同步。

我们来看下面的例子:

valueG = 0
groupG = new(sync.WaitGroup)

mutexG = new(sync.Mutex)

addRoutine = fn(countA) {

	for i = 0; i < countA; i++ {
		mutexG.Lock()
		valueG = valueG + 2
		mutexG.Unlock()
	}

	groupG.Done()

}

minusRoutine = fn(countA) {

	for i = 0; i < countA; i++ {
		mutexG.Lock()
		valueG = valueG - 2
		mutexG.Unlock()
	}

	groupG.Done()
}

times = 5000

groupG.Add(2)

go addRoutine(times)
go minusRoutine(times - 2)

groupG.Wait()

printfln("valueG: %v", valueG)


这段代码中,addRoutine和minusRoutine是两个线程函数,分别用于将一个共享的全局变量valueG每次加2或者减2,为了解决共享冲突问题,定义了一个共享锁变量mutexG,这样就可以用常规的Lock(加锁)和Unlock(解锁)操作了。

另外,为了在主进程中等待两个线程都执行完毕后再继续,使用了一个WaitGroup变量groupG,一开始用groupG.Add(2)这一句设置了计数器为2表示要等待两个线程退出,之后每一次线程中调用groupG.Done()表示退出了一个线程,计数器为0时,groupG.Wait()函数才会结束阻塞继续执行后面的语句,这样就实现了多个线程的同步(这种情况也叫线程的归并)。

最后,这段代码无论执行多少次(本例中加法线程执行5000次,由times变量确定,减法线程少执行2次),都会输出以下的结果:

λ gox sync.gox
valueG: 4

说明是解决了共享冲突的,因为如果没有处理好共享冲突,结果不一定会恰好为4(应当为4是因为减法的线程少执行了两次)。


* 注:由于0.988版本后,为了减少不必要的文件体积,Gox已经放弃了其他脚本引擎,仅支持Qlang引擎,因此本文中的内容已经无效,仅留作对旧版本的参考。

下面是Anko引擎版的代码与执行结果:

sync = import("sync")
tk = import("tk")

var valueG = 0
var groupG = make(sync.WaitGroup)

var mutexG = make(sync.Mutex)

func addRoutine(countA) {

	for i = 0; i < countA; i++ {
		mutexG.Lock()
		valueG = valueG + 2
		mutexG.Unlock()
	}

	groupG.Done()

}

func minusRoutine(countA) {

	for i = 0; i < countA; i++ {
		mutexG.Lock()
		valueG = valueG - 2
		mutexG.Unlock()
	}

	groupG.Done()
}

times = 5000

groupG.Add(2)

go addRoutine(times)
go minusRoutine(times - 2)

groupG.Wait()

printfln("valueG: %v", valueG)

这段代码无论执行多少次,都会输出以下的结果:

λ gox scripts\sync.ank
valueG: 4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆满庭

谢谢您的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值