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

我们如何在Go中使用通道代替互斥体?

池兴邦
2023-03-14
问题内容

通道将通信(值的交换)与同步相结合,以确保两个计算(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循环保持运行,即使队列中有一个线程也是如此。 编辑:重新阅读我的代码,我可以看到它是完全错误的。但是,这就是为什么我在这里寻求帮助。 问题答案: 我不知道您为什么要使用