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

主线程,协程和互斥锁

package main
//路径上加上包的唯一标识 demo14,线程和协程,是go的核心
import (
	"fmt"
	"time"
	"sync"
)

// 需求:计算1-200之间所有数的阶乘,并且把各个数的阶乘放入map中。最后显示出来。使用协程完成。
var (
	map1 = make(map[int]int, 10) // 声明一个全局map
	lock sync.Mutex //互斥锁
)
func main() {
	for i := 1; i <= 200; i++ {
		// 启动200个协程
		go test(i)
	}
	//问题1 主线程休眠10秒钟,不休眠的话,因为主线程结束,协程也会结束,但是休眠的时间不确定
	
	time.Sleep(time.Second * 10)
	lock.Lock() // 读加锁 读的时候,可能会出现竞争,因为主线程不知道10秒钟协程是否执行完成;加锁可以避免这个问题
	for i, v := range map1 {
		fmt.Printf("map[%d]=%d\n", i, v)
	}
	lock.Unlock() // 读解锁
}
func test(n int){
	// 计算阶乘的函数
	res := 1
	for i := 1; i <= n; i++ {
		res = res * i
	}
	// 问题2,如果多个线程同时尝试写同一个数据结构(如Map),就可能发生数据竞争、数据不一致或其他并发问题
	lock.Lock() // 写,加锁
	map1[n] = res
	lock.Unlock() //写完,解锁
}

go build -race ./main.go之后执行main.exe,可以检查是否存在竞争问题


http://www.kler.cn/a/461653.html

相关文章:

  • MySQL 08 章——聚合函数
  • C++ —— 智能指针
  • 关于IDE的相关知识之三【插件安装、配置及推荐的意义】
  • Ansys Discovery 中的网格划分方法:探索模式
  • 电子电器框架 --- 电动汽车上的车载充电器(OBC)
  • HTTP Scheme 通常指的是在 URL 中用于指定使用 HTTP 协议的方案(scheme)
  • java故障注入
  • 【机器人】机械臂:精度、重复精度、控制器分辨率、手腕、末端执行器
  • Jmeter的安装与使用
  • leetcode 热题100(131. 分割回文串)c++
  • 体育实时数据是怎么获取的
  • 【漫话机器学习系列】029.累积分布函数(Cumulative Distribution Function)
  • 【2024年-12月-4日-开源社区openEuler实践记录】pkgs - categorizer:简化软件包管理的开源智慧助手
  • SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)
  • maven大面积依赖报错
  • 求各种排序算法的执行时间
  • 计算机网络-数据链路层(ppp协议)
  • go.Bar如何在lengend超长时候显示省略号,但是在hover时候显示完整值
  • Leetcode 10-正则表达式匹配/ 剑指 Offer 19. 正则表达式匹配
  • redis - 集群知识
  • Vue强制渲染组件部分:技巧详解与实战应用
  • 水库水雨情监测系统:水位、雨量、流量等参数全天候实时监测
  • ubuntu安装qt creator 并配置交叉编译环境
  • 生物信息-linux-centos8-安装blast
  • PageView组件的用法
  • Java开发-后端请求成功,前端显示失败