如何在Golang中创建命名互斥锁?

qncylg1j  于 2023-02-17  发布在  Go
关注(0)|答案(2)|浏览(166)

我是Golang的新手,我尝试创建一个命名互斥锁。我尝试复制:

hMutex = CreateMutex( 
    NULL,                        // default security descriptor
    FALSE,                       // mutex not owned
    TEXT("NameOfMutexObject"));  // object name

我看到的同步示例似乎没有说明命名互斥锁。

iqjalb3h

iqjalb3h1#

命名互斥锁(Windows中)实际上是为了在进程之间共享互斥锁,和/或简化从单个进程中代码的不同部分引用同一互斥锁(在一个位置创建互斥锁,并在其他位置“打开”现有互斥锁)。
Go语言中的互斥体更像Windows中的临界区(至少在概念上,我不能说底层的实现)。
在Windows中,命名互斥锁使不同的进程能够共享互斥锁,方法是通过互斥锁的名称获取对互斥锁的引用。
要在Go语言中共享互斥锁,你可以声明互斥锁,使其在需要的地方可被引用,或者向需要它的函数传递一个引用。
由此可见,互斥锁(在Go语言中)不能在进程之间共享;如果这是你的用例,那么你需要探索其他的跨进程同步机制,但是如果你所需要的只是同步同一进程中的线程,那么就使用互斥锁,不用担心你不能给它一个名字。

yjghlzjz

yjghlzjz2#

下面是一个使用sync的已命名互斥锁的示例-这是您正在寻找的吗?

package main

import (
    "fmt"
    "sync"
)

var mutexMap sync.Map

func createMutex(name string) *sync.Mutex {
    mutex, ok := mutexMap.Load(name)
    if !ok {
        newMutex := &sync.Mutex{}
        mutex, _ = mutexMap.LoadOrStore(name, newMutex)
    }
    return mutex.(*sync.Mutex)
}

func main() {
    hMutex := createMutex("NameOfMutexObject")
    hMutex.Lock()
    fmt.Println("Locked Mutex: NameOfMutexObject")
    hMutex.Unlock()
    fmt.Println("Unlocked Mutex: NameOfMutexObject")
}

相关问题