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 + 2mutexG.Unlock()}groupG.Done()}minusRoutine = fn(countA) {for i = 0; i < countA; i++ {mutexG.Lock()valueG = valueG - 2mutexG.Unlock()}groupG.Done()
}times = 5000groupG.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 + 2mutexG.Unlock()}groupG.Done()}func minusRoutine(countA) {for i = 0; i < countA; i++ {mutexG.Lock()valueG = valueG - 2mutexG.Unlock()}groupG.Done()
}times = 5000groupG.Add(2)go addRoutine(times)
go minusRoutine(times - 2)groupG.Wait()printfln("valueG: %v", valueG)

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

λ gox scripts\sync.ank
valueG: 4

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

  1. golang中关于读写锁、互斥锁的理解

    锁的概述 为了解决协程同步的问题我们使用了channel,但是GO也提供了传统的同步工具. 它们都在GO的标准库代码包sync和sync/atomic中. 下面我们看一下锁的应用. 什么是锁呢?就是某 ...

  2. Linux多线程实践(6) --Posix读写锁解决读者写者问题

    Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restr ...

  3. golang中的读写锁

    简介 互斥锁本质是当一个协程访问的时候,其他协程都不能访问. 其实主要是想:修改数据要同步,这样其他协程才可以感知到,所以真正的互斥应该是读取和修改,修改和修改之间,读和读是没有互斥操作的必要的 读写 ...

  4. Gox语言中使用Sciter库进行GUI图形界面编程-GX23.1

    Sciter是非常优秀的跨平台GUI图形界面编程库,只需附带一个动态链接库文件,就可以实现基于HTML/CSS/TiScript的图形界面,并且已经经过很多公司和商用产品的实际检验,稳定可靠.我们常见 ...

  5. Gox语言中进行屏幕截图并显示在Sciter图形界面中-GX38.2

    本例承接GX38.1一文中的例子,加了一些改进,在进行界面截图后,将图片展示在用Sciter包编写的图形界面上. 代码如下: // 设置github.com/kbinani/screenshot包的简 ...

  6. java 读写锁_Java中的读写锁

    一.读写锁 1.初识读写锁 a)Java中的锁--Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进 ...

  7. 用信号量和读写锁解决读者写者问题

    用信号量和读写锁解决读者写者问题 参考文章: (1)用信号量和读写锁解决读者写者问题 (2)https://www.cnblogs.com/xybaby/p/6559212.html 备忘一下.

  8. java 阻塞锁_Java实现锁、公平锁、读写锁、信号量、阻塞队列、线程池等常用并发工具...

    锁的实现 锁的实现其实很简单,主要使用Java中synchronized关键字. public class Lock { private volatile boolean isLocked = fal ...

  9. Gox语言中的基本数据类型及其转换-GX5.1

    Gox语言默认选用Qlang语法引擎,Qlang脚本语言又是基于Go语言(Golang)做了一定的改进,数据类型基本继承自Go语言,数据的赋值等操作也基本类似但略加改进和变化.一个主要的不同是,Gox ...

最新文章

  1. 设为首页 收藏(IE可用)
  2. C++程序崩溃生成dump
  3. Github Star 11.5K项目再发版:AAAI 2021 顶会论文开源,80+多语言模型全新升级
  4. failed to find romfile efi-virtio.rom
  5. 如何成为架构师?3条有效的实战经验
  6. Core Data数据操作
  7. 在tomcat下context.xml中配置各种数据库连接池(转)
  8. 数据结构与算法之单链表(1)
  9. PHP7中异常与错误处理与之前版本对比
  10. 线元法输入曲线要素_Origin入门教程(三):Origin中曲线怎么平移?
  11. matlab 附录 周开利,【新书推荐】【2005.07】神经网络模型及其MATLAB仿真程序设计(周开利)...
  12. 台安变频器n2按键说明_台安n2系列变频器说明书
  13. 服务器搭建说明以及接口调用文档
  14. 北大公开课计算机,清华、北大、浙大的计算机课程资源集都在这里了
  15. 十一假期,终于过上了理想的生活节奏
  16. 程序员可以收藏的几个导航网站
  17. mysql 1677错误_[转载]MySQL 5.5.12 row格式复制下从库结构变更引发1677错误一则
  18. 微信公众号文章采集的一些基础概念
  19. 生活杂感: 理性与感性
  20. Xxl Job Helloworld

热门文章

  1. 呼吸机的工作原理及其主要功能
  2. laravel入门学习文档
  3. 今天我给大家分享几款珍藏已久的指标公式,都是简单好用的指标
  4. python迭代器和for循环区别_python迭代器和for循环区别,
  5. 空间载波(载频)关键技术及其实现
  6. 阿里张勇发股东信:坚定成为数字化时代基础设施
  7. Node读写Excel文件(txt文件)
  8. [Excel知识技能] Txt文件数据批量导入Excel
  9. zabbix微信告警HTML,ZABBIX实现微信告警
  10. 关于echarts生成地图的二三事