gpt4 book ai didi

go - "selective"goroutines 互斥

转载 作者:数据小太阳 更新时间:2023-10-29 03:38:53 26 4
gpt4 key购买 nike

我是 Go 的新手,我想实现一个自定义的互斥机制,每个应用程序用户一次可以执行一个 goroutine。为简化起见,将 U1 和 U2 视为应用程序用户以及 F1(userId)、F2(userId) 和 F3(userId) 三个不同的 goroutine,它们从数据库读取/写入记录仅与给定用户相关 .我希望,如果 U1 调用 (F1、F2、F3)、(F2、F3) 在 F1 结束之前不执行,那么执行 F2 或 F3(按调用顺序将是最佳解决方案),最后剩下的被执行。 U2 不受 U1 锁的影响,但如前所述,她由自己的锁控制。你将如何实现?有内置的原语吗?谢谢

最佳答案

使用sync.Mutex为了互斥。为每个事件用户使用一个互斥体。

我假设用户是由某种 ID 标识的。我们称该类型为 userID。使用由 userID 键控的映射来存储每个用户的互斥体。

只有活跃用户才需要互斥量,而不是所有潜在用户。使用整数计数器确定用户是否处于事件状态。

上述映射和计数器也应由互斥锁保护。

代码如下:

type userID string // replace userID type with id type for your application

// userLock is the per user lock
type userLock struct {
sync.Mutex

// n is number of goroutines between lock and unlock
n int
}

var (
// mu protects locks map and n field in userLock
mu sync.Mutex

// locks is map of active locks
locks = map[userID]*userLock{}
)


// lockUser locks the user specified by id. If the lock is
// already in use, the calling goroutine blocks until
// the lock is available.
func lockUser(id userID) {
mu.Lock()
l := locks[id]
if l == nil {
l = &userLock{}
locks[id] = l
}
l.n++
mu.Unlock()
l.Lock()
}

// unlockUser unlocks the user specified by id. It
// is a run-time error if the user is not locked on
// entry unlockUser.
func unlockUser(id userID) {
mu.Lock()
l := locks[id]
if l == nil {
panic("unlock without lock")
}
l.n--
if l.n == 0 {
delete(locks, id)
}
mu.Unlock()
l.Unlock()
}

关于go - "selective"goroutines 互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54540798/

26 4 0