登录
首页 >  Golang >  Go问答

并发 Goroutines 的互斥

来源:Golang技术栈

时间:2023-04-13 12:00:24 184浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《并发 Goroutines 的互斥》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

在我的代码中有三个并发例程。我尝试简要概述我的代码,

Routine 1 {
do something

*Send int to Routine 2
Send int to Routine 3
Print Something
Print Something*

do something
}

Routine 2 {
do something

*Send int to Routine 1
Send int to Routine 3
Print Something
Print Something*

do something
}

Routine 3 {
do something

*Send int to Routine 1
Send int to Routine 2
Print Something
Print Something*

do something
}

main {
routine1
routine2
routine3
}

我想要这样,当两个之间的代码做某事(两个星号之间的代码)正在执行时,控制流不能转到其他 goroutines。例如,当例程 1 正在执行两颗星之间的事件(发送和打印事件)时,例程 2 和 3 必须被阻塞(意味着执行流程不会从例程 1 传递到例程 2 或 3)。完成最后一个打印事件后,执行流程可能会转到例程 2 或 3。任何人都可以通过指定来帮助我,我该如何实现?是否可以通过WaitGroup实现上述规范?任何人都可以通过给出一个简单的例子来告诉我如何使用 WaitGroup 来实现上述指定的例子。谢谢。

注意:我给出了两个发送和两个打印选项,实际上有很多发送和打印。

正确答案

如果我理解正确,您想要的是防止同时执行每个功能的某些部分和其他功能。以下代码执行此操作:fmt.Println在其他例程运行时不会发生行。以下是发生的情况:当执行到达打印部分时,它会等到其他例程结束,如果它们正在运行,并且当这个打印行正在执行时,其他例程不会启动并等待。我希望这就是你要找的。如果我对此有误,请纠正我。

package main

import (
    "fmt"
    "rand"
    "sync"
)

var (
    mutex1, mutex2, mutex3 sync.Mutex
    wg sync.WaitGroup
)

func Routine1() {
    mutex1.Lock()
    // do something
    for i := 0; i 

更新 :让我在这里解释这三个互斥锁:互斥锁,如文档所述:“互斥锁”。这意味着当您调用互斥锁时Lock,如果其他人锁定了同一个互斥锁,您的代码就会在那里等待。在您调用Unlock该被阻止的代码后,将立即恢复。

在这里,我通过在函数开头锁定互斥锁并在结尾解锁互斥锁,将每个函数放入自己的互斥锁中。通过这种简单的机制,您可以避免在运行这些函数的同时运行您想要的任何代码部分。例如,在任何地方你想有一个在运行时不应该运行的代码Routine1,只需mutex1在该代码的开头锁定并在结尾解锁。这就是我在 和 的适当行中所做Routine2Routine3。希望能澄清事情。

今天关于《并发 Goroutines 的互斥》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>