返回顶部
首页 > 资讯 > 后端开发 > GO >与列表的数据竞争。使用互斥锁进行列表并发访问
  • 336
分享到

与列表的数据竞争。使用互斥锁进行列表并发访问

2024-04-05 00:04:15 336人浏览 薄情痞子
摘要

golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《与列表的数据竞争。使用互斥锁进行列表并发访问》带大家来了解一下##content_ti

golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《与列表的数据竞争。使用互斥进行列表并发访问》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发


问题内容

我正在进行数据竞赛,但我不太明白为什么。使用 -race 命令运行我的测试,我已将范围缩小到尝试在读取时访问 list.list,但我的互斥体似乎没有执行任何操作。

我在数组中有许多 *list.lists,如下所示:

type mylist struct {
    mutex sync.mutex
    *list.list
}

type someobj struct {
    data string
}

var mylistoflists [10]mylist

我正在从列表中读取和写入,如下所示:

list := mylistoflists[someindex]
list.mutex.lock()
for e := list.front(); e != nil; e = e.next() {
        if (...) {
            list.movetofront(e)
        }
}
list.mutex.unlock()

并且在另一个 Goroutine 中也尝试读取并构建完整列表以返回

var fullCopy []*SomeObj
list := myListOfLists[someIndex]

list.mutex.Lock()
for e := list.Front(); e != nil; e = e.Next() {
        fullCopy = append(fullCopy, e.Value.(SomeObj))
}
list.mutex.Unlock()


解决方案


语句 list := mylistoflists[someindex] 将数组元素复制到变量 list。这会复制互斥锁,从而阻止互斥锁工作。 go vet 命令报告此问题。

您可以通过使用指向数组元素的指针来避免复制:

list := &mylistoflists[someindex]

另一种方法是使用指向 mylist 的指针数组。当您这样做时,您也可以在 mylist 中使用列表值而不是列表指针:

type MyList struct {
    mutex sync.Mutex
    list.List
}

var myListOfLists [10]*MyList
for i := range myListOfLists {
   myListOfLists[i] = &MyList{}
}

以上就是《与列表的数据竞争。使用互斥锁进行列表并发访问》的详细内容,更多关于的资料请关注编程网公众号!

您可能感兴趣的文档:

--结束END--

本文标题: 与列表的数据竞争。使用互斥锁进行列表并发访问

本文链接: https://lsjlt.com/news/596149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作