jjzjj

戈朗 : is a mutex required for a package-scoped variable with read-only access?

coder 2023-07-02 原文

如果我有一个像这样的包范围变量:

var (
    bus *Bus // THIS VARIABLE
)

// Bus represents a repository bus. This contains all of the repositories.
type Bus struct {
    UserRepository *UserRepository
    // ...
}

...并且我允许访问我的存储库上的 bus 变量,以便它们可以相互访问,如果它们可以同时使用,我是否需要使用任何类型的互斥锁?

会发生什么的快速伪代码:

// Router
router.GET("/user/:id", c.FindUser)

// Controller
func (c *UserController) FindUser(w http.ResponesWriter, r *http.Request) {
    w.Write([]byte(c.UserService.FindUser(r.Get("id"))))
}

// Service
func (s UserService) FindUser(id int) *domain.User {
    return s.UserRepository.FindByID(id) 
}

// Repository
func (r UserRepository) FindByID(id int) *domain.User {
    // This is where the package-scope `bus` variable will be used
}

FindByID 函数中,我可以使用包范围的 bus 变量,当然可以并发访问它,因为它会在 HTTP 请求触发时被调用,并且这些都是同时处理的。

最佳答案

如果您所做的只是读取变量的内容——那么不,您不需要互斥体。但是,如果您改变了它的状态,那么您需要保护它。

两个并发写入或并发写入和读取可能会导致问题。如果您的写入很少,您可能需要使用 RWMutex .它将允许多个读者访问,但不能与一个作者一起访问。

另外,查看 race detector .它是尽力而为检测器,所以它不能保证你没有竞争条件,但它可以检测到一些用例。另请注意,您需要引起竞争,以便竞争检测器检测到它,因此必须编写同时使用您的 bus 或模拟真实条件的测试。

关于戈朗 : is a mutex required for a package-scoped variable with read-only access?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45515809/

有关戈朗 : is a mutex required for a package-scoped variable with read-only access?的更多相关文章

随机推荐