Go语言实现线程安全访问队列
来源:互联网 发布:豫广网络机顶盒wifi 编辑:程序博客网 时间:2024/06/05 15:28
这个例子用Go语言的包"container/list"实现一个线程安全访问的队列。其中不少细节耐人寻味,做出它则是花费了不少精力,找不到样例啊!
Go语言的许多优点自不必说,然而从C/C++程序角度看,语言的语法也好,程序的实现方式也好,看起来总有点怪怪的感觉。
在这个程序的基础上,是很容易实现一个线程安全访问的堆栈的。
Go语言程序:
// structlist project main.gopackage 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 =1Array1: 1 Array2: 1 SFlag=trueFigure =2Array1: 2 1 Array2: 2 1 SFlag=falseFigure =3Array1: 3 2 1 Array2: 4 2 1 SFlag=false
程序说明:
1.接口类型转结构类型,花费了好多时间,其做法堪称一绝,见79行。
2.全局变量lock是队列访问锁。
3.队列使用来资源锁,设计成线程安全访问的。
4.程序中并没有使用goroutine,如果需要可以使用类似这样的代码"go func() { q.push(n) }()"
阅读全文
0 0
- Go语言实现线程安全访问队列
- python实现线程安全队列
- 利用条件变量实现线程安全队列
- C++ 实现线程安全的任务队列
- c++11 线程安全的队列实现
- iOS 用队列实现读写线程安全
- java实现线程安全的队列
- 线程安全的队列
- linux 线程安全队列
- C++线程安全队列
- 线程安全随机队列
- 线程安全的队列
- 队列的线程安全
- 安全线程队列
- linux多线程编程(C):信号量实现的线程安全队列
- linux多线程编程(C):互斥量实现的线程安全队列
- 单例模式实现 线程安全的队列 处理
- 用生产者消费者模型实现的线程安全环形队列
- leetcode 312. Burst Balloons 分析
- 外网无法访问阿里云服务器解决方案
- 统计字符串中出现次数最多的字符及个数
- HDU 5974 && 2016ICPC大连 D: A Simple Math Problem
- scikit-learn的用法
- Go语言实现线程安全访问队列
- php处理抢购类功能的高并发请求
- javaWEB中前后台乱码解决问题小结
- Hexo主题和文章发布
- 训练日记8.19
- jQuery监听鼠标滚轮事件
- PCB布线线宽和过孔孔径设置为多少合适?
- Maven入门教程笔记
- 模块和包