当前位置: 首页 > 面试题库 >

Mutex.Lock()如何知道要锁定哪些变量?

章岳
2023-03-14
问题内容

我是新手,所以请保持温柔。

因此,我已经在某些代码中使用互斥锁了几周了。我了解其背后的概念:锁定对特定资源的访问权限,与之交互(读或写),然后为其他人再次解锁。

我使用的互斥锁代码主要是复制粘贴调整。该代码可以运行,但是我仍在努力解决其内部问题。到目前为止,我一直在结构中使用互斥锁来锁定该结构。今天,我发现了这个例子,这使我完全不清楚互斥锁实际上是在锁定什么。以下是一段示例代码:

var state = make(map[int]int)

var mutex = &sync.Mutex{}

var readOps uint64
var writeOps uint64

// Here we start 100 goroutines to execute repeated reads against the state, once per millisecond in each goroutine.
for r := 0; r < 100; r++ {
    go func() {
        total := 0
        for {
            key := rand.Intn(5)
            mutex.Lock()
            total += state[key]
            mutex.Unlock()
            atomic.AddUint64(&readOps, 1)

            time.Sleep(time.Millisecond)
        }
    }()
}

让我感到困惑的是,互斥锁和它应该锁定的值之间似乎没有任何联系。直到今天,我还认为互斥锁可以锁定特定的变量,但是看这段代码,似乎可以以某种方式将整个程序锁定为仅执行锁定下方的行,直到再次运行解锁为止。我想这意味着所有其他goroutine都会暂停片刻,直到再次运行解锁。由于代码已编译,因此我想它可以知道在lock()和之间访问了哪些变量unlock(),但是我不确定是否是这种情况。

如果所有其他程序都暂停片刻,这听起来并不像真正的多处理程序,所以我想我对所发生的事情没有很好的了解。

有人可以帮助我了解计算机如何知道应锁定哪些变量吗?


问题答案:

锁定对特定资源的访问权限,与之进行交互(读或写),然后再次为其他人解锁。

基本上是。

让我感到困惑的是,互斥锁和它应该锁定的值之间似乎没有任何联系。

Mutex只是一个互斥对象,它可以同步对资源的访问。这意味着,如果两个不同的goroutine要锁定互斥锁,则只有第一个可以访问它。现在,第二个goroutine会无限期等待,直到它本身可以锁定互斥体为止。与变量没有任何关系,可以根据需要使用互斥体。例如,仅一个http请求,仅一个数据库读/写操作或仅一个变量分配。尽管我不建议在这些示例中使用互斥锁,但总体思路应该很清楚。

但是看这段代码,似乎会以某种方式将整个程序锁定为仅执行锁下面的行,直到再次运行解锁为止。

并不是整个程序,只有每个想要访问 同一个 互斥锁的goroutine都等到可以。

我想这意味着所有其他goroutine都会暂停片刻,直到再次运行解锁。

不,他们不会暂停。他们执行直到想要访问相同的互斥锁为止。

如果要使用变量将互斥锁专门分组,为什么不创建结构?



 类似资料:
  • 有谁能分享一下firebase mobile client如何知道在网络连接丢失和重新建立的情况下从服务器下载什么数据的知识吗? 这么说吧: 数据库中有一个对象具有密钥key1和Key3。 移动客户端下载了它们并下线。 同时,添加了key2和key4 客户端恢复连接并以某种方式接收key2和Key4。 它到底怎么知道发生了什么变化? null

  • 我在laravel 5中工作,我有一个模块,用户可以在其中更新学生的信息,因为用户有一个带有当前数据的预加载表单,并且可以修改他想要的字段。然后,在控制器中,我执行以下操作: 那工作得很好。所以我的问题是:有一种方法可以获得已经更新的字段的名称?

  • 我正在使用Hazelcast Imap接口以分布式方式锁定项目,而不是将项目放在map中,我只是调用lock方法,它似乎有效,但我不知道如何查询哪些项目当前被锁定,因为项目在map中不可用。有没有方法可以查询Hazelcast锁定的键?下面是示例代码:public void testMap_DistributedLock(){final Config hazelcastConfig=new Con

  • 本文向大家介绍知道哪些ES6,ES7的语法?相关面试题,主要包含被问及知道哪些ES6,ES7的语法?时的应答技巧和注意事项,需要的朋友参考一下 promise,await/async,let、const、块级作用域、箭头函数 ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

  • 考虑以下代码:(注意:为了代码清晰起见,删除了所有尝试/捕获) 现在假设创建了两个线程,它们都只需在它们的<code>run()</code>中调用<code>process()</code>方法。 假设当thread2尝试访问时,锁已经被thread1获取了。据我所知,thread2将跳过同步锁,退出,并启动(这就是拥有多个锁对象的意义)。但我的问题是thread2如何知道“返回”并完成,而不是

  • 问题内容: 我在Linux Ubuntu服务器中搜索php.ini文件所在的路径,并且在执行命令时发现很多php.ini 。那么如何从php.ini所在的php脚本网页中确切地知道呢? 问题答案: 您可以使用php_ini_loaded_file() 取自php.net: 您可能还需要检查php_ini_scanned_files() 另外,您应该注意,如果从CLI运行PHP脚本,则有可能使用与服