文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-05 00:19

关注

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{}
}

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯