我是Golang的新手,我尝试创建一个命名互斥锁。我尝试复制:
hMutex = CreateMutex( NULL, // default security descriptor FALSE, // mutex not owned TEXT("NameOfMutexObject")); // object name
我看到的同步示例似乎没有说明命名互斥锁。
iqjalb3h1#
命名互斥锁(Windows中)实际上是为了在进程之间共享互斥锁,和/或简化从单个进程中代码的不同部分引用同一互斥锁(在一个位置创建互斥锁,并在其他位置“打开”现有互斥锁)。Go语言中的互斥体更像Windows中的临界区(至少在概念上,我不能说底层的实现)。在Windows中,命名互斥锁使不同的进程能够共享互斥锁,方法是通过互斥锁的名称获取对互斥锁的引用。要在Go语言中共享互斥锁,你可以声明互斥锁,使其在需要的地方可被引用,或者向需要它的函数传递一个引用。由此可见,互斥锁(在Go语言中)不能在进程之间共享;如果这是你的用例,那么你需要探索其他的跨进程同步机制,但是如果你所需要的只是同步同一进程中的线程,那么就使用互斥锁,不用担心你不能给它一个名字。
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") }
2条答案
按热度按时间iqjalb3h1#
命名互斥锁(Windows中)实际上是为了在进程之间共享互斥锁,和/或简化从单个进程中代码的不同部分引用同一互斥锁(在一个位置创建互斥锁,并在其他位置“打开”现有互斥锁)。
Go语言中的互斥体更像Windows中的临界区(至少在概念上,我不能说底层的实现)。
在Windows中,命名互斥锁使不同的进程能够共享互斥锁,方法是通过互斥锁的名称获取对互斥锁的引用。
要在Go语言中共享互斥锁,你可以声明互斥锁,使其在需要的地方可被引用,或者向需要它的函数传递一个引用。
由此可见,互斥锁(在Go语言中)不能在进程之间共享;如果这是你的用例,那么你需要探索其他的跨进程同步机制,但是如果你所需要的只是同步同一进程中的线程,那么就使用互斥锁,不用担心你不能给它一个名字。
yjghlzjz2#
下面是一个使用sync的已命名互斥锁的示例-这是您正在寻找的吗?