go并发编程系列五:线程分组及控制线程的按序执行

发布时间 2023-09-02 17:04:09作者: jamstack

背景:本文是对:go并发编程系列四:线程分组及控制线程的交替执行 的扩展,假定场景基本一致,唯一不同的是:本文中的张三、李四需要按序执行,通俗的讲就是:张三、李四对应的线程虽然同属于一组,但谁的线程先执行,就由谁优先完成班主任规定的一组任务。

拆分为技术片段的话,意味着:张三、李四对应的线程由普通线程变成了各自持有互斥锁的线程,哪个线程先获得锁,就由哪个线程先执行规定的一组任务。

代码如下:

package concurrent

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

// 在这个例子里,我们希望王五不要捣乱,等张三和李四竞争完成任务,王五再出现
// 即:张三和李四对应的线程先执行,王五对应的线程最后执行

var mutexImprove2 sync.Mutex // 创建一个互斥锁

func ThreadMutexImporve2ZhangSan(wg *sync.WaitGroup) {
    mutexImprove2.Lock()
    defer mutexImprove2.Unlock()
    defer wg.Done()

    for i :=1; i <= 3; i++ {
        fmt.Println("张三:", task[i])
        time.Sleep(time.Millisecond * 500)
    }
}

func ThreadMutexImprove2LiSi(wg *sync.WaitGroup) {
    mutexImprove2.Lock()
    defer mutexImprove2.Unlock()
    defer wg.Done()

    for i := 1; i <= 3; i++ {
        fmt.Println("李四:", task[i])
        time.Sleep(time.Millisecond * 500)
    }
}

func ThreadMutexImprove2WangWu() {
    for i := 1; i <= 3; i++ {
        fmt.Println("王五*:", task[i])
        time.Sleep(time.Millisecond * 500)
    }
}