通道将通信(值的交换)与同步相结合,以确保两个计算(goroutines)处于已知状态。
如何使用Google Go中的频道执行互斥功能?
package main
import "sync"
var global int = 0
var m sync.Mutex
func thread1(){
m.Lock()
global = 1
m.Unlock()
}
func thread2(){
m.Lock()
global = 2
m.Unlock()
}
func main(){
go thread1()
go thread2()
}
将通道用作互斥对象的示例:
package main
var global int = 0
var c = make(chan int, 1)
func thread1(){
<-c // Grab the ticket
global = 1
c <- 1 // Give it back
}
func thread2(){
<-c
global = 2
c <- 1
}
func main() {
c <- 1 // Put the initial value into the channel
go thread1()
go thread2()
}
您也可以使用chan struct{}
而不是chan int
减小内存大小。输入的值是struct{}{}
(type
struct{}
和一个空的content {}
)。有关示例,请参见Ivan
black的评论
。
问题内容: 我试图了解互斥的工作原理。到目前为止,据我了解,它可以进行原子操作并同步对某些数据的访问。 我在这里构建了一个队列数据结构的示例:https : //github.com/arnauddri/algorithms/blob/master/data- structures%2Fqueue%2Fqueue.go 这是一些代码: 但是,当我尝试创建队列并将项目推送到该队列时,出现运行时错误:
上面的例子中,我们看过了如何在多个协程之间原子地访问计数器,对于更复杂的例子,我们可以使用Mutex来在多个协程之间安全地访问数据。 package main import ( "fmt" "math/rand" "runtime" "sync" "sync/atomic" "time" ) func main() { // 这个例子的状态就
问题内容: 如果我正确使用通道,是否需要使用互斥锁来防止并发访问? 问题答案: 如果正确使用通道,则不需要互斥。在某些情况下,使用互斥锁的解决方案可能会更简单。 只需确保包含通道值的变量已正确初始化,然后使用多个goroutine尝试访问通道变量即可。一旦完成,按设计访问通道(例如,向它们发送值或从中接收值)是安全的。 带有参考文献的证明文件(重点由我添加): 规格:渠道类型: 单个信道 ,可以使
问题内容: 我正在寻找一种解决方案,可以多路复用一些通道输出。 我有一个数据源,它是从我发送到单个通道的读取的。另一方面,我有一个从通道读取的websocket请求处理程序。现在,发生了两个客户端创建一个websocket连接的情况,它们均从同一通道读取,但每个客户端仅获得部分消息。 代码示例(简体): 现在,当两次被调用时,第二个调用仅返回在第一个调用中创建的通道,这将导致上述问题。 问题是:
问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为
问题内容: 我从python中的多线程开始(或者至少我的脚本有可能创建多个线程)。该算法是否是Mutex的正确用法?我尚未测试此代码,它可能甚至无法正常工作。我只希望processData在一个线程中运行(一次一个),而主while循环保持运行,即使队列中有一个线程也是如此。 编辑:重新阅读我的代码,我可以看到它是完全错误的。但是,这就是为什么我在这里寻求帮助。 问题答案: 我不知道您为什么要使用