我试图了解互斥的工作原理。到目前为止,据我了解,它可以进行原子操作并同步对某些数据的访问。
我在这里构建了一个队列数据结构的示例:https :
//github.com/arnauddri/algorithms/blob/master/data-
structures%2Fqueue%2Fqueue.go
这是一些代码:
package queue
import "sync"
type Queue struct {
queue []interface{}
len int
lock *sync.Mutex
}
func New() *Queue {
queue := &Queue{}
queue.queue = make([]interface{}, 0)
queue.len = 0
return queue
}
func (q *Queue) Push(el interface{}) {
q.lock.Lock()
defer q.lock.Unlock()
q.queue = append(q.queue, el)
q.len++
}
但是,当我尝试创建队列并将项目推送到该队列时,出现运行时错误:
q := New()
q.Push(1)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
我真的不明白这里发生了什么。
我应该如何在这里使用Mutex?
非常感谢
看起来问题在于您从未实例化互斥体。运行该New()
函数时,您正在创建一个空的Queue,其中包含一个可以引用互斥量的变量,但实际上您从未告诉过它这样做,这意味着在这一点上queue.lock == nil
。您可以通过在New()
函数中添加实例化行来解决此问题。
queue.lock = new(sync.Mutex)
这是一个有效的游乐场演示:http :
//play.golang.org/p/Qa6buDaHIj
上面的例子中,我们看过了如何在多个协程之间原子地访问计数器,对于更复杂的例子,我们可以使用Mutex来在多个协程之间安全地访问数据。 package main import ( "fmt" "math/rand" "runtime" "sync" "sync/atomic" "time" ) func main() { // 这个例子的状态就
问题内容: 我从python中的多线程开始(或者至少我的脚本有可能创建多个线程)。该算法是否是Mutex的正确用法?我尚未测试此代码,它可能甚至无法正常工作。我只希望processData在一个线程中运行(一次一个),而主while循环保持运行,即使队列中有一个线程也是如此。 编辑:重新阅读我的代码,我可以看到它是完全错误的。但是,这就是为什么我在这里寻求帮助。 问题答案: 我不知道您为什么要使用
问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为
问题内容: 通道将通信(值的交换)与同步相结合,以确保两个计算(goroutines)处于已知状态。 如何使用Google Go中的频道执行互斥功能? 问题答案: 将通道用作互斥对象的示例: 您也可以使用而不是减小内存大小。输入的值是(type 和一个空的content )。有关示例,请参见Ivan black的评论 。
我已经编写了3个互斥类TMutex、TCondition和TSpinLock,它们都有一个void lock()和一个void unlock()成员。现在我想对它们使用std::lock\u-guard。我在源文件末尾为我的新互斥类安装了lock_guard,如下所示: 如果我使用: 我收到以下编译器错误消息: .../src/inc/threads.cpp:317: 39:错误:没有匹配函数调用
Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 gor