Go语言实现线程安全访问队列
这个例子用Go语言的包"container/list"实现一个线程安全访问的队列。其中不少细节耐人寻味,做出它则是花费了不少精力,找不到样例啊!
Go语言的许多优点自不必说,然而从C/C++程序角度看,语言的语法也好,程序的实现方式也好,看起来总有点怪怪的感觉。
在这个程序的基础上,是很容易实现一个线程安全访问的堆栈的。
Go语言程序:
// structlist project main.go
package mainimport ("container/list""fmt""sync"
)const N int = 10type QueueNode struct {figure intdigits1 [N]intdigits2 [N]intsflag booldata *list.List
}var lock sync.Mutexfunc newQueue() *QueueNode {q := new(QueueNode)q.data = list.New()return q
}func (q *QueueNode) push(v interface{}) {defer lock.Unlock()lock.Lock()q.data.PushFront(v)
}func (q *QueueNode) dump() {for iter := q.data.Back(); iter != nil; iter = iter.Prev() {fmt.Println("item:", iter.Value)}
}func (q *QueueNode) pop() interface{} {defer lock.Unlock()lock.Lock()iter := q.data.Back()v := iter.Valueq.data.Remove(iter)return v
}func main() {var n QueueNoden.figure = 1n.digits1[0] = 1n.digits2[0] = 1n.sflag = truen2 := nn2.digits1[n2.figure] = 2n2.digits2[n2.figure] = 2n2.figure++n2.sflag = falsen3 := n2n3.digits1[n2.figure] = 3n3.digits2[n2.figure] = 4n3.figure++q := newQueue()q.push(n)q.push(n2)q.push(n3)q.dump()fmt.Printf("\nlen=%d\n\n", q.data.Len())for q.data.Len() > 0 {x := q.pop().(QueueNode)output_node(&x)}}func output_node(n *QueueNode) {fmt.Printf("Figure =%d\n", n.figure)fmt.Printf("Array1: ")for i := n.figure - 1; i >= 0; i-- {fmt.Printf("%d ", n.digits1[i])}fmt.Println("")fmt.Printf("Array2: ")for i := n.figure - 1; i >= 0; i-- {fmt.Printf("%d ", n.digits2[i])}fmt.Println("")if n.sflag {fmt.Printf("SFlag=true\n")} else {fmt.Printf("SFlag=false\n")}fmt.Println("")
}
程序运行结果:
item: {1 [1 0 0 0 0 0 0 0 0 0] [1 0 0 0 0 0 0 0 0 0] true <nil>}
item: {2 [1 2 0 0 0 0 0 0 0 0] [1 2 0 0 0 0 0 0 0 0] false <nil>}
item: {3 [1 2 3 0 0 0 0 0 0 0] [1 2 4 0 0 0 0 0 0 0] false <nil>}len=3Figure =1
Array1: 1
Array2: 1
SFlag=trueFigure =2
Array1: 2 1
Array2: 2 1
SFlag=falseFigure =3
Array1: 3 2 1
Array2: 4 2 1
SFlag=false
程序说明:
1.接口类型转结构类型,花费了好多时间,其做法堪称一绝,见79行。
2.全局变量lock是队列访问锁。
3.队列使用来资源锁,设计成线程安全访问的。
4.程序中并没有使用goroutine,如果需要可以使用类似这样的代码"go func() { q.push(n) }()"
Go语言实现线程安全访问队列相关推荐
- 基于C语言的线程通信消息队列实现
在多线程编程中经常需要进行线程与线程间的通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同时候使用.但是要注意的是线程的同步和互斥. 线程同步是指线程之间所具有的一 ...
- 【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 )
文章目录 I . 线程简单使用 II . 互斥锁 III . 条件变量 线程同步 IV . 完整代码示例 006_ThreadSafeQueue.h 006_ThreadSafeQueue.cpp S ...
- 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )
文章目录 I 线程创建方法 II 线程执行函数 III 线程标识符 IV 线程属性 V 线程属性 1 ( 分离线程 | 非分离线程 ) VI 线程属性 2 ( 线程调度策略 ) VII 线程属性 3 ...
- 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )
文章目录 一.线程池阻塞队列 二.拒绝策略 三.使用 ThreadPoolExecutor 自定义线程池参数 一.线程池阻塞队列 线程池阻塞队列是线程池创建的第 555 个参数 : BlockingQ ...
- ibm mq并发访问队列_消息队列之九问九答
问题1 为什么要用消息队列呀? 答:如下图所示,外呼系统需要将外呼结果发送给业务系统,如果采用rpc的调用方式:则带来的后果, 首先,1.外呼系统与业务系统严重耦合,多个业务系统需要外呼系统传输数据, ...
- 【重难点】【JUC 03】怎么实现一个线程安全的队列、手写模拟实现一个阻塞队列
[重难点][JUC 03]怎么实现一个线程安全的队列.手写模拟实现一个阻塞队列 文章目录 [重难点][JUC 03]怎么实现一个线程安全的队列.手写模拟实现一个阻塞队列 一.怎么实现一个线程安全的队列 ...
- java安全级别_java语言的线程安全级别--转
java是支持多线程编程的语言,java中提供了很多类,如果把这些类的实现按照线程安全级别来排序的话,则由强到弱主要可以分为以下几个级别 1 绝对线程安全 在任何环境下,调用者都不需要考虑额外的同步措 ...
- java 多线程(四)—— 线程同步/互斥=队列+锁
同步.异步.互斥的区别 在很多文章中,直接把同步缩小为互斥,并称之为同步.下面也是这样的. 一.线程同步 = 队列 + 锁 同步(这里说的其实是互斥)就是多个线程同时访问一个资源. 那么如何实现? 队 ...
- day9 进程 线程 threading multiprocessing 队列 主机批量管理工具
一.进程与线程 1.进程 进程是系统资源加上一个或多个线程的集合 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了. 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起 ...
最新文章
- 一段使用cURL实现的网页抓取源码,支持POST,Cookies,代理,自定义头.
- Windows下Python 3.6 + VS2017 + Anaconda 解决Unable to find vcvarsall.bat问题
- 世界首份博客报纸问世
- ASP.NET 2.0+Atlas编写鼠标拖放程序
- 转:Oracle物理文件
- Centos7 error: Failed to initialize NSS library
- 初学者python笔记(迭代器、生成器、三元表达式、列表解析、send()与yield())
- html 页面怎么自动定位到某个标签,JS如何实现在页面上快速定位(锚点跳转问题)...
- Unhandled exception in MSDEV.EXE(DEVSHL.DLL) 0xC0000005 access violation
- JAVA常用类之包装类
- WPF实现选项卡效果(1)——使用AvalonDock
- 不重启刷新win7环境变量(注册表)
- 如何在web配置一个高效采集数据的DTM?
- 秦羽接引的鸿蒙第四人,星辰变:秦羽用过的法宝一件比一件厉害,最后一件直接逆天改命!...
- 苹果手机投影到墙上_电视VS投影仪,你会选哪个?
- Windows系统电脑常用快捷键
- CentOS8搭建实现私有CA和证书申请
- 软件测试与治学的三重境界
- FutureTask源码解析
- Docker清理的常用方法
热门文章
- 开源GIS(十七)——OGC标准
- cocos2d-x之SimpleGame分析
- python中队列的应用用场景_消息队列使用的四种场景介绍
- 面包屑php源码,自己写的面包屑导航
- 技术文件服务器搭建,搭建文件服务器_mob604756e49326的技术博客_51CTO博客
- manjaro 安装mysql_manjaro安装mysql5.7
- Tableau上面地图与条形图结合_Tableau | 20种常用图表(上文)
- TensorFlow总结(2020版)
- OpenCV总结:图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
- VS中的lib和dll的区别和使用