栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

并发Goroutine互斥

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

并发Goroutine互斥

如果我正确理解了它,那么您想要的是防止同时执行每个功能的某些部分和其他功能。下面的代码执行此操作:

fmt.Println
在其他例程正在运行时,行不会发生。这就是发生的情况:当执行到达打印部分时,它将等待直到其他例程结束(如果它们正在运行),并且在执行此打印行时,其他例程将不会启动并等待。我希望这就是您想要的。如果我对此有误,请纠正我。

package mainimport (    "fmt"    "rand"    "sync")var (    mutex1, mutex2, mutex3 sync.Mutex    wg sync.WaitGroup)func Routine1() {    mutex1.Lock()    // do something    for i := 0; i < 200; i++ {        mutex2.Lock()        mutex3.Lock()        fmt.Println("value of z")        mutex2.Unlock()        mutex3.Unlock()    }    // do something    mutex1.Unlock()    wg.Done()}func Routine2() {    mutex2.Lock()    // do something    for i := 0; i < 200; i++ {        mutex1.Lock()        mutex3.Lock()        fmt.Println("value of z")        mutex1.Unlock()        mutex3.Unlock()    }    // do something    mutex2.Unlock()    wg.Done()}func Routine3() {    mutex3.Lock()    // do something    for i := 0; i < 200; i++ {        mutex1.Lock()        mutex2.Lock()        fmt.Println("value of z")        mutex1.Unlock()        mutex2.Unlock()    }    // do something    mutex3.Unlock()    wg.Done()}func main() {    wg.Add(3)    go Routine1()    go Routine2()    Routine3()    wg.Wait()}

更新
:让我在这里解释这三个互斥锁:一个互斥锁,如文档所述:“互斥锁”。这意味着当您调用

Lock
互斥锁时,如果其他人已锁定相同的互斥锁,则代码仅在此处等待。在您致电后
Unlock
,被阻止的代码将立即恢复。

在这里,我通过在函数的开头锁定互斥锁并将其解锁来将每个函数置于自己的互斥锁中。通过这种简单的机制,您可以避免与这些功能同时运行所需的任何代码部分。例如,在您想要拥有运行时不应该运行的代码的任何地方

Routine1
,只需
mutex1
在该代码的开头锁定并在末尾解锁即可。这就是我在
Routine2
和中的适当行中所做的
Routine3
。希望能澄清一些事情。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452315.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号