首页 > 其他分享 >Golang多线程打印ABC

Golang多线程打印ABC

时间:2024-03-18 18:00:38浏览次数:26  
标签:wg ABC struct make chan sync Golang 多线程

package main

import (
    "fmt"
    "sync"
)

func ThreeG() {
    var ch1, ch2, ch3 = make(chan struct{}), make(chan struct{}), make(chan struct{})
    var wg sync.WaitGroup
    wg.Add(3)

    go func(s string) {
        defer wg.Done()
        for i := 1; i <= 3; i++ {
            <-ch1
            fmt.Println(s)
            ch2 <- struct{}{}
        }
        <-ch1
    }("A")

    go func(s string) {
        defer wg.Done()
        for i := 1; i <= 3; i++ {
            <-ch2
            fmt.Println(s)
            ch3 <- struct{}{}
        }
    }("B")

    go func(s string) {
        defer wg.Done()
        for i := 1; i <= 3; i++ {
            <-ch3
            fmt.Println(s)
            ch1 <- struct{}{}
        }
    }("C")

    // 在向chan写入数据时,会阻塞当前协程,直到其他协程从该chan中读取了数据。
    ch1 <- struct{}{}
    wg.Wait()
}

func NG(n int) {
    chanQueue := make([]chan struct{}, n)
    for i := 0; i < n; i++ {
        chanQueue[i] = make(chan struct{})
    }
    var wg sync.WaitGroup
    wg.Add(n)
    for i := 0; i < n; i++ {
        var preChan chan struct{}
        if i == 0 {
            preChan = chanQueue[n-1]
        } else {
            preChan = chanQueue[i-1]
        }
        curChan := chanQueue[i]
        go func(i byte, preChan, curChan chan struct{}, index int) {
            defer wg.Done()
            for k := 0; k < 5; k++ {
                <-preChan
                fmt.Printf("%c\n", i)
                curChan <- struct{}{}
            }

            if index == 0 {
                <-chanQueue[n-1]
            }

        }('A'+byte(i), preChan, curChan, i)
    }
    chanQueue[n-1] <- struct{}{}

    wg.Wait()
    fmt.Println("done")
}

func main() {
}

 

标签:wg,ABC,struct,make,chan,sync,Golang,多线程
From: https://www.cnblogs.com/mainull/p/18081081

相关文章

  • golang fasthttp服务端的简单实现
    使用示例:packagemainimport("github.com/buaazp/fasthttprouter""github.com/valyala/fasthttp""log")funcmain(){//创建路由r:=fasthttprouter.New()r.GET("/",Index)iferr:=fasthttp.Listen......
  • 多线程系列(二十一) -ForkJoin使用详解
    一、摘要从JDK1.7开始,引入了一种新的Fork/Join线程池框架,它可以把一个大任务拆成多个小任务并行执行,最后汇总执行结果。比如当前要计算一个数组的和,最简单的办法就是用一个循环在一个线程中完成,但是当数组特别大的时候,这种执行效率比较差,例如下面的示例代码。longsum=0......
  • 【golang语言】
    目录数据类型基础数据类型boolstringintint8int16int32int64uintuint8uint16uint32uint64uintptrbyterunefloat32float64complex64complex128类型转换go语言不允许隐式转换别名类型和原有类型也不能进行隐式转换类型的预定义值......
  • abc291E 寻找唯一排列
    有数组A[n],其元素值正好是1~n的一个排列。现在不知道具体的A,但已知m组条件,对于(x,y),有A[x]<A[y],问根据这m组条件能否唯一确定A,如果可以,输出Yes和A,否则输出No。2<=n,m<=2e5;1<=x[i],y[i]<=n排列唯一有两个等价条件:bfs拓扑排序过程中,队列时刻保持只有1个元素。如果看成dag,最长......
  • [ABC258F] Main Street 题解
    题意:你要在平面直角坐标系中行走,每一步可以上下左右四个方向任意移动$1$,耗时$k$秒。特别地,存在若干条快速通道,若该步起点和终点均满足$x\equiv0\pmod{B}$或$y\equiv0\pmod{B}$,则认为该步是在快速通道上进行,仅需耗时$1$秒。询问从$(S_x,S_y)$到$(G_x,G_y)$最......
  • 07.多线程的概述
    1.线程的概述进程--是我们程序的执行实例,进程在执行的时候,真正执行的就是进程中的线程,进程只是提供了线程执行的资源(PCB)。---进程包含线程进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。线程:......
  • abc325D 打印机最多能打印的文档数
    有n份文档和一台打印机,第i份文档在t[i]时刻进入打印区,停留d[i]时间后离开打印区,打印机可以在[t[i],t[i]+d[i]]范围内打印它,打印耗时不计,在打印完成后,需要1个单位时间恢复。问最多能打印多少份材料?1<=n<=2e5;1<=t[i],d[i]<=1e18打印机每次应选择在打印区内,并且最先离开打印区的......
  • abc324E 合并两字符串后能
    给定n个字符串s[n]和字符串t,从中任选一对下标(i,j),要求i<=j,让s[i]与s[j]连起来得到一个新的串,要求由新串删除0个或多个字符可以得到t,问存在多少对满足条件的下标对?1<=n<=5e5;1<=len(s[i]),len(t)<=5e5假设由字符串x能得到t的前缀长度为a,字符串y能得到t的后缀长度为b,如果a+b>=le......
  • ABC 345 F - Many Lamps
    ABC345F-ManyLamps解题思路:每次选取一条边,要么亮两个,要么灭两个,要么一灭一暗。亮的个数的奇偶性不变,所以不可能亮奇数个。考虑每个连通块。如果是偶数个一定能全亮,奇数个则最少一个不亮。对于两暗的,需要时通过操作点亮是一定的。考虑一明一暗时是加入边的操作意味什么:......
  • abc343F 区间第2大的出现次数
    给定数组a[n],有Q组操作,格式为:1px,将a[p]修改为x;2lr,查询区间[l,r]内第2大元素的出现次数。1<=n,q<=2e5;1<=a[i]<=1e9用线段树维护各个区间的最大及次大元素的出现次数,合并时最多只保留两条记录。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#......