当前位置: 首页 > news >正文

golang以打印机为例 互斥锁的问题 使用channel解决

package main

import (
	"fmt"
	"time"
)

func person1(str string,c chan <-int)  {
	printer(str)
	c<-1    //往里面写
}
func person2(c  <- chan int,o chan <-bool)  {
	 if num:=<-c;num==1{
		 printer("world")
	 }
    o<-true
}

func printer(str string)  {
	 for _,data:=range str{
	 	fmt.Printf("%c",data)
	 	time.Sleep(time.Second)
	 }
	 fmt.Println()
}

func main()  {
	c:=make(chan int)
   o:=make(chan bool)
	go person1("hello",c)
	go person2(c,o)
	for{
       if nu,_:=<-o;nu==true{
       	fmt.Println("6666")
		   return
	   }
	}
}

————————————————————————————————————————————————————————————
使用sync.Mutex程序执行结果与多任务资源竞争时一致。最终由于添加了互斥锁,可以按序先输出hello再输出 world。但这里需要我们自行创建互斥锁,并在适当的位置对锁进行释放。

package main

import (
	"fmt"
	"sync"
	"time"
)

var mutex sync.Mutex


func person1(str string)  {
	 printer(str)
}

func person2()  {
	printer("world")
}

func printer(s string)  {
	mutex.Lock()   //添加互斥锁
	for _,data:= range s{
		fmt.Printf("%c",data)
		time.Sleep(time.Second)
	}
	fmt.Println()
	defer mutex.Unlock()  //使用结束时解锁
}

func main()  {
	go person1("hello")
	go person2()

	for  {
		;
	}

}

 

相关文章:

  • 几道面试题
  • golang读写锁简单例子
  • 急问数据结构用c c++描述的区别?
  • golang条件变量的作用并不保证在同一时刻仅有一个协程(线程)访问某个共享的数据资源
  • 华为面试题3
  • golang多个消费者访问共享数据
  • 创建第一个区块001
  • c语言常见出错信息(转)
  • 创建我的第一个区块链002
  • 几种开发工具的特性比较(转载)
  • 添加区块到区块链当中003
  • 很难见得到的一篇关于windows进程的说明书(转载)
  • 补充区块代码更新函数004
  • byte二位数组转换问题005
  • 写在周日的凌晨( 一次思维的对话)
  • 【Leetcode】104. 二叉树的最大深度
  • JavaScript 基本功--面试宝典
  • Java比较器对数组,集合排序
  • JAVA并发编程--1.基础概念
  • JS函数式编程 数组部分风格 ES6版
  • Phpstorm怎样批量删除空行?
  • 阿里云前端周刊 - 第 26 期
  • 二维平面内的碰撞检测【一】
  • 观察者模式实现非直接耦合
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端存储 - localStorage
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 算法---两个栈实现一个队列
  • gunicorn工作原理
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • (C++17) std算法之执行策略 execution
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (一)认识微服务
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ***详解账号泄露:全球约1亿用户已泄露
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .Net中ListT 泛型转成DataTable、DataSet
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • ::before和::after 常见的用法
  • ??在JSP中,java和JavaScript如何交互?
  • [ C++ ] STL---stack与queue
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明
  • [iOS开发]iOS中TabBar中间按钮凸起的实现