首页 > 其他分享 >chan 实现简单卖票功能

chan 实现简单卖票功能

时间:2023-06-01 11:23:30浏览次数:24  
标签:售票口 卖票 chan sync sale ticketChan 简单 go main

一、chan代码

package main

import (
	"fmt"
	"sync"
)

var code sync.WaitGroup

func main() {

	// 创建一个int类型通道
	ticketChan := make(chan int)

	// 判断还有几个线程
	code.Add(5)

	// 启动五个协程
	go codeSale("售票口1", ticketChan)
	go codeSale("售票口2", ticketChan)
	go codeSale("售票口3", ticketChan)
	go codeSale("售票口4", ticketChan)
	go codeSale("售票口5", ticketChan)
	for i := 0; i < 10; i++ {
		//fmt.Println("main", i+1)

		// 给通道赋值
		ticketChan <- i + 1
	}
	// 关闭通道
	close(ticketChan)

	// 待 wg 归零,才会继续向下执行
	code.Wait()
}

func codeSale(name string, ch chan int) {
	// 协程结束
	defer code.Done()
	for {
		ans, ok := <-ch
		//fmt.Printf("%s,票是否卖完%t\n", name, !ok)
		if !ok {
			fmt.Println(name + "已经关闭")
			break
		}
		fmt.Printf("%s售出了%d号票\n", name, ans)
	}
}

二、锁代码

package main

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

// 加锁
var mutex sync.Mutex

var wW sync.WaitGroup

// 总票数 10张
var ticket int = 10

func main() {
	wW.Add(4)
	go sale("张三")
	go sale("李四")
	go sale("王五")
	go sale("赵六")

	wW.Wait()

	//time.Sleep(time.Second * 3)
}

// 卖票
func sale(name string) {
	defer wW.Done()
	for {
		// 加锁
		mutex.Lock()
		if ticket > 0 {
			time.Sleep(time.Millisecond)
			fmt.Println(name+"拿到了一张票", ticket)
			ticket--
		} else {
			fmt.Println("票卖完了")
			// 解锁
			mutex.Unlock()
			break
		}
		// 解锁
		mutex.Unlock()
	}
}

标签:售票口,卖票,chan,sync,sale,ticketChan,简单,go,main
From: https://www.cnblogs.com/yylls/p/17448433.html

相关文章

  • 【Oracle】Show the change history of tbs' size
     注意:脚本都从dba_hist_tbspc_space_usage系统视图获取数据,但是这个系统视图中保存的数据的时间是依赖AWR采样数据保留期限的。所以你从这个系统视图可能查找不出很早之前的表空间数据使用情况,如果需要历史的表空间使用数据,可能需要定期采集数据并存储到起来。 Innonmult......
  • 简单封装一下pymysql库
      简单封装一下pymysql库my_pymysql.py#!/bin/python#-*-coding:utf-8-*-importpymysqlimportnumpydefget_connect(**kwargs):mysqldb=pymysql.connect(host=kwargs.get('host'),user=kwargs.get('user'),passw......
  • 【socket】服务端与客户端简单代码
    1、C实现代码ExampleofClient-ServerPrograminC(UsingSocketsandTCP)|ProgrammingLogic  2、问题调试经验--缺少头文件导致的段错误-戴安澜式编程-博客园(84条消息)【C语言】warning:implicitdeclarationoffunction‘xxx’[-Wimplicit-function-de......
  • Docker 常用命令简单总结
    1、安装docker1.1、安装docker:sudoapt-getinstall-ydocker.io1.2、启动docker服务:systemctlstartdocker1.3、设置开机启动:systemctlenabledocker1.4、查看docker版本:docker--version1.5、查看Dockercpu/内存占用状态:dockerstats--help1.6、查看Docker状态:systemctlsta......
  • 一个简单的科普-延迟与RT时间
    一个简单的科普-延迟与RT时间背景发现稍微一复杂就没人看.这次像是写一个简单的科普文章.主要说一下网络延迟还有网络的响应时间.这里想通过一个题目进行引申.如果Skylink全球商用:中国与美国之间的网络是走海底光纤延迟低,还是走skylink延迟低?关于时延的理解我认......
  • HDU4259(简单群置换)
    题目:DoubleDealing#include<iostream>#include<string.h>#defineLLlonglongconstintN=1005;intn,k;inta[N][N];boolf[N];intnum[N];LLgcd(LLa,LLb){returnb?gcd(b,a%b):a;}intmain(){inti,j;while(std::cin>......
  • 使用NPOI组件简单实现导出
    首先我们在NuGet程序包管理中下载NPOI组件目前版本稳定的是:2.4.1这里可以看一下NPOI下载完成后生成的四个引用,其作用然后废话也不多说了,直接上代码然后我们在项目中进行引用usingNPOI.SS.UserModel;usingNPOI.XSSF.UserModel;usingNPOI.HSSF.UserModel;点......
  • 02.简单工厂
    定义提供一个创建对象实例的功能,而无需关心具体实现。创建实例的类型可以是接口、抽象类,也可以是具体的类。代码示例///<summary>///工厂类,用来创建api对象///</summary>publicclassFactory{publicstaticIApiCreateApi(intcondition){IApiapi......
  • 最大熵模型原理——选择符合所有事实,在其他方面尽可能均匀分布(熵最大)的模型,其实思想很
    1.熵与最大熵原理熵是随机变量不确定性的度量,不确定性越大,熵值就越大;若随机变量退化成定值,熵为0。均匀分布是“最不确定”的分布假设离散随机变量X的概率分布为P(x),则其熵为:联合熵和条件熵两个随机变量的X,Y的联合分布,可以形成联合熵,用H(X,Y)表示条件熵H(X|Y)=H(X,Y)-H(Y) 相对......
  • mDNS原理的简单理解——每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的
    MDNS协议介绍mDNSmulticastDNS,使用5353端口,组播地址224.0.0.251。在一个没有常规DNS服务器的小型网络内,可以使用mDNS来实现类似DNS的编程接口、包格式和操作语义。MDNS协议的报文与DNS的报文结构相同,但有些字段对于MDNS来说有新的含义。每个进入局域网的主机,如果开启了mDNS服......