首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在内部锁定对所有struct字段的并发访问?

如何在内部锁定对所有struct字段的并发访问?
EN

Stack Overflow用户
提问于 2018-03-10 21:28:14
回答 2查看 1.6K关注 0票数 1

如何在内部锁定对所有struct字段的并发访问?假设我有一个结构:

代码语言:javascript
复制
 type Data struct {
    ID string
    Size int
    //... and more fields
 }

将在另一个结构中使用:

代码语言:javascript
复制
type Project struct {
    mu sync.Mutex
    MetaData Data
    //... and more fields
}

我如何修改/获取MetaData结构并为此使用互斥锁,同时又不将其互斥暴露给外部包?我知道我可以使用Get/Set方法,但是如果我需要修改一个数据结构字段(如果每个字段都有一个具有相同共享互斥的get/set方法,那么就不是很好/干净了)。您能推荐一种方法/模式来拥有一个内部锁定/解锁的结构化互斥体吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-10 22:19:13

像这样的怎么样?

代码语言:javascript
复制
type Data struct {
    ID   string
    Size int
    //... and more fields
}

type Project struct {
    mu       sync.Mutex
    metaData Data
    //... and more fields
}

func (p *Project) AccessMetaData(f func(*Data)) {
    p.mu.Lock()
    defer p.mu.Unlock()
    f(&p.metaData)
}
票数 3
EN

Stack Overflow用户

发布于 2018-11-23 06:48:12

我对此很好奇,所以我对此进行了测试,如果父结构被锁定,子结构也会被锁定。在本地尝试,因为去操场似乎是决定性的。

代码语言:javascript
复制
package main

import (
    "fmt"
    "sync"
)

type testGroup struct {
    sync.Mutex
    items map[string]*test
}

type test struct {
    x int
}

var str string = "test"

func increment(t *testGroup, wg *sync.WaitGroup) {
    t.Lock()
    t.items[str].x = t.items[str].x + 1
    t.Unlock()
    wg.Done()
}

func main() {
    var w sync.WaitGroup
    tg := testGroup{}
    tg.items = make(map[string]*test)
    tg.items[str] = &test{}
    for i := 0; i < 1000; i++ {
        w.Add(1)
        go increment(&tg, &w)
    }
    w.Wait()
    fmt.Println("final value of x", tg.items[str].x)
}

尝试注释掉t.Lock()t.Unlock()中的increment()函数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49214205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档