登录
首页 >  Golang >  Go问答

Golang中如何使用密钥来实现互斥体的加锁和解锁操作?

来源:stackoverflow

时间:2024-02-10 18:21:23 175浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《Golang中如何使用密钥来实现互斥体的加锁和解锁操作?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

假设我有一组 goroutine

wg := sync.waitgroup{}
wg.add(5)
go somefunction("a", &wg) //1
go somefunction("b", &wg) //2
go somefunction("a", &wg) //3
go somefunction("a", &wg) //4
go somefunction("b", &wg) //5

wg.wait()

我要求的是特定字符串(此处为“a”或“b”)的一个goroutine同时运行。任何时候都只能运行 somefunction("a", &wg) 之一。例如, //1 和 //2 开始同时运行。 //2完成后,//5开始运行。 //1完成后,//3或//4中的任何一个开始运行。

我正在考虑开发一个基于密钥的互斥体来解决这个问题。

somefunction(key string){
   Lock(key)
   //piece of code
   Unlock(key)
}

该代码段将被锁定为此处的特定密钥。


正确答案


可能可以实现一个特殊的锁,例如

type stringkeylock struct {
    locks map[string]*sync.mutex

    maplock sync.mutex // to make the map safe concurrently
}

func newstringkeylock() *stringkeylock {
    return &stringkeylock{locks: make(map[string]*sync.mutex)}
}

func (l *stringkeylock) getlockby(key string) *sync.mutex {
    l.maplock.lock()                   
    defer l.maplock.unlock()           
                                       
    ret, found := l.locks[key]
    if found {
        return ret
    }

    ret = &sync.mutex{}
    l.locks[key] = ret
    return ret
}

func (l *stringkeylock) lock(key string) {
    l.getlockby(key).lock()
}                                                   
                                                    
func (l *stringkeylock) unlock(key string) {        
    l.getlockby(key).unlock()                       
}

然后初始化一个“全局”stringkeylock

var stringkeylock = newstringkeylock()

最后,使用它

func somefunction(key string){
   stringKeyLock.Lock(key)
   //piece of code
   stringKeyLock.Unlock(key)
}

以上就是《Golang中如何使用密钥来实现互斥体的加锁和解锁操作?》的详细内容,更多关于的资料请关注golang学习网公众号!

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