这个例子用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语言实现线程安全访问队列相关推荐

  1. 基于C语言的线程通信消息队列实现

    在多线程编程中经常需要进行线程与线程间的通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同时候使用.但是要注意的是线程的同步和互斥.          线程同步是指线程之间所具有的一 ...

  2. 【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 )

    文章目录 I . 线程简单使用 II . 互斥锁 III . 条件变量 线程同步 IV . 完整代码示例 006_ThreadSafeQueue.h 006_ThreadSafeQueue.cpp S ...

  3. 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )

    文章目录 I 线程创建方法 II 线程执行函数 III 线程标识符 IV 线程属性 V 线程属性 1 ( 分离线程 | 非分离线程 ) VI 线程属性 2 ( 线程调度策略 ) VII 线程属性 3 ...

  4. 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )

    文章目录 一.线程池阻塞队列 二.拒绝策略 三.使用 ThreadPoolExecutor 自定义线程池参数 一.线程池阻塞队列 线程池阻塞队列是线程池创建的第 555 个参数 : BlockingQ ...

  5. ibm mq并发访问队列_消息队列之九问九答

    问题1 为什么要用消息队列呀? 答:如下图所示,外呼系统需要将外呼结果发送给业务系统,如果采用rpc的调用方式:则带来的后果, 首先,1.外呼系统与业务系统严重耦合,多个业务系统需要外呼系统传输数据, ...

  6. 【重难点】【JUC 03】怎么实现一个线程安全的队列、手写模拟实现一个阻塞队列

    [重难点][JUC 03]怎么实现一个线程安全的队列.手写模拟实现一个阻塞队列 文章目录 [重难点][JUC 03]怎么实现一个线程安全的队列.手写模拟实现一个阻塞队列 一.怎么实现一个线程安全的队列 ...

  7. java安全级别_java语言的线程安全级别--转

    java是支持多线程编程的语言,java中提供了很多类,如果把这些类的实现按照线程安全级别来排序的话,则由强到弱主要可以分为以下几个级别 1 绝对线程安全 在任何环境下,调用者都不需要考虑额外的同步措 ...

  8. java 多线程(四)—— 线程同步/互斥=队列+锁

    同步.异步.互斥的区别 在很多文章中,直接把同步缩小为互斥,并称之为同步.下面也是这样的. 一.线程同步 = 队列 + 锁 同步(这里说的其实是互斥)就是多个线程同时访问一个资源. 那么如何实现? 队 ...

  9. day9 进程 线程 threading multiprocessing 队列 主机批量管理工具

    一.进程与线程 1.进程 进程是系统资源加上一个或多个线程的集合 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了. 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起 ...

最新文章

  1. 一段使用cURL实现的网页抓取源码,支持POST,Cookies,代理,自定义头.
  2. Windows下Python 3.6 + VS2017 + Anaconda 解决Unable to find vcvarsall.bat问题
  3. 世界首份博客报纸问世
  4. ASP.NET 2.0+Atlas编写鼠标拖放程序
  5. 转:Oracle物理文件
  6. Centos7 error: Failed to initialize NSS library
  7. 初学者python笔记(迭代器、生成器、三元表达式、列表解析、send()与yield())
  8. html 页面怎么自动定位到某个标签,JS如何实现在页面上快速定位(锚点跳转问题)...
  9. Unhandled exception in MSDEV.EXE(DEVSHL.DLL) 0xC0000005 access violation
  10. JAVA常用类之包装类
  11. WPF实现选项卡效果(1)——使用AvalonDock
  12. 不重启刷新win7环境变量(注册表)
  13. 如何在web配置一个高效采集数据的DTM?
  14. 秦羽接引的鸿蒙第四人,星辰变:秦羽用过的法宝一件比一件厉害,最后一件直接逆天改命!...
  15. 苹果手机投影到墙上_电视VS投影仪,你会选哪个?
  16. Windows系统电脑常用快捷键
  17. CentOS8搭建实现私有CA和证书申请
  18. 软件测试与治学的三重境界
  19. FutureTask源码解析
  20. Docker清理的常用方法

热门文章

  1. 开源GIS(十七)——OGC标准
  2. cocos2d-x之SimpleGame分析
  3. python中队列的应用用场景_消息队列使用的四种场景介绍
  4. 面包屑php源码,自己写的面包屑导航
  5. 技术文件服务器搭建,搭建文件服务器_mob604756e49326的技术博客_51CTO博客
  6. manjaro 安装mysql_manjaro安装mysql5.7
  7. Tableau上面地图与条形图结合_Tableau | 20种常用图表(上文)
  8. TensorFlow总结(2020版)
  9. OpenCV总结:图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
  10. VS中的lib和dll的区别和使用