jjzjj

无互斥

coder 2024-07-14 原文

好的,Go“专家”。您将如何在惯用的 Go 中编写此代码,也就是在 next 中没有互斥锁?

package main

import (
    "fmt"
)

func main() {
    done := make(chan int)
    x := 0
    for i := 0; i < 10; i++ {
        go func() {
            y := next(&x)
            fmt.Println(y)
            done <- 0
        }()
    }
    for i := 0; i < 10; i++ {
        <-done
    }
    fmt.Println(x)

}

var mutex = make(chan int, 1)

func next(p *int) int {
    mutex <- 0
    // critical section BEGIN
    x := *p
    *p++
    // critical section END
    <-mutex
    return x

}

假设你不能在临界区同时有两个 goroutine,否则会发生不好的事情。

我的第一个猜测是有一个单独的 goroutine 来处理状态,但我想不出一种方法来匹配输入/输出。

最佳答案

您将使用实际的 sync.Mutex:

var mutex sync.Mutex

func next(p *int) int {
    mutex.Lock()
    defer mutex.Unlock()
    x := *p
    *p++
    return x
}

尽管您可能还会将 next 功能、状态和 sync.Mutex 分组到一个结构中。

虽然在这种情况下没有理由这样做,因为 Mutex 更适合围绕单个资源进行互斥,您可以使用 goroutines 和 channel 来达到相同的效果

http://play.golang.org/p/RR4TQXf2ct

x := 0

var wg sync.WaitGroup
send := make(chan *int)
recv := make(chan int)

go func() {
    for i := range send {
        x := *i
        *i++
        recv <- x
    }
}()

for i := 0; i < 10; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()
        send <- &x
        fmt.Println(<-recv)
    }()
}
wg.Wait()
fmt.Println(x)

关于无互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795785/

有关无互斥的更多相关文章

  1. ruby-on-rails - Rails 中的类实例变量应该在互斥体中设置吗? - 2

    假设我的Rails项目中有一个设置实例变量的Ruby类。classSomethingdefself.objects@objects||=begin#somelogicthatbuildsanarray,whichisultimatelystoredin@objectsendendend是否可以多次设置@objects?是否有可能在一个请求期间,在上面的begin/end之间执行代码时,可以在第二个请求期间调用此方法?我想这实际上归结为Rails服务器实例如何fork的问题。我应该改用Mutex还是线程同步?例如:classSomethingdefself.objectsreturn@o

  2. ruby - ActiveRecord 模型的互斥锁 - 2

    我的用户模型有一个讨厌的方法,不应该为同一记录的两个实例同时调用。我需要连续执行两个http请求,同时确保任何其他线程不会同时对同一记录执行相同的方法。classUser...defnasty_long_running_method//somethingnastywillhappenifthismethodiscalledsimultaneously//fortwoinstancesofthesamerecordandthelateronefinisheshttp_request_1//beforethefirstonefinisheshttp_request_2.http_reque

  3. javascript - ReactJS 和 jQuery 是互斥的吗? - 2

    我是ReactJS的新手。ReactJS似乎完全接管了渲染DOM节点的责任,并且不期望任何其他干扰,即使是jQuery。它带来了很多方便的jQuery插件无法在React中使用的事实。其中一些插件实现了等效的React组件,但还远远不够。有没有一种优雅的方法可以将这两件事结合在一起? 最佳答案 快速的回答是没有优雅的方式来组合它们并且让你的应用程序在不使用丑陋的hack的情况下工作。与jQuery相比,ReactJS使用了根本不同的逻辑。在使用ReactJS时,您真的不想弄乱DOM,而这正是jQuery所做的。但是如果您在同一页面上

  4. javascript - AngularJS 以互斥方式将类应用于多个按钮 - 2

    我是AngularJS的新手,具有jQuery背景,并且仍在尝试进入Angular思维。我有几个button,例如:btn1btn2...btnN使用jQuery来实现我的目标,即一次只有一个button有activeclass,我会做jQuery$(".btn").on('click',function(){$(this).siblings().removeClass('active').end().addClass('active');});CSS.active{...}但我没有找到在Angular中执行此操作的通用方法。我找到了3个按钮的解决方案,但它变得粗鲁,尤其是当我的应用程

  5. javascript - JavaScript 中的互斥量——这看起来像是一个正确的实现吗? - 2

    这不是一个完全严肃的问题,更像是一个淋浴的想法:JavaScript的await关键字应该允许一些感觉非常像普通“并发语言”中的互斥体的东西。functionMutex(){varself=this;//stillunsureabouthow"this"iscapturedvarmtx=newPromise(t=>t());//fulfilledpromise≡unlockedmutexthis.lock=asyncfunction(){awaitmtx;mtx=newPromise(t=>{self.unlock=()=>t();});}}//Lockawaitmutex.lock(

  6. http - 在包级别声明互斥变量是一种好习惯吗? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion在一个包中,我声明了一些变量和一个互斥变量。我想用它来锁定或解锁包级变量的获取/设置。varmutexsync.MutexvartplPath=""funcPrepare(c*gin.Context){mutex.Lock()tplPath="abc"mutex.Unlock()}在并发http请求中使用mutex可以防止tplPath上的get/set竞争条件是否可以被视为良好实践?

  7. 无互斥 - 2

    好的,Go“专家”。您将如何在惯用的Go中编写此代码,也就是在next中没有互斥锁?packagemainimport("fmt")funcmain(){done:=make(chanint)x:=0fori:=0;i假设你不能在临界区同时有两个goroutine,否则会发生不好的事情。我的第一个猜测是有一个单独的goroutine来处理状态,但我想不出一种方法来匹配输入/输出。 最佳答案 您将使用实际的sync.Mutex:varmutexsync.Mutexfuncnext(p*int)int{mutex.Lock()defer

  8. go - 如果没有互斥体,并发处理 slice 无法按预期工作 - 2

    函数WithMutex和WithoutMutex给出了不同的结果。WithoutMutex实现正在丢失值,即使我设置了Waitgroup。有什么问题吗?DonotrunonPlayground附言我使用的是Windows10和Go1.8.1packagemainimport("fmt""sync")varp=fmt.PrintlntypeMuTypestruct{list[]int*sync.RWMutex}varmuData*MuTypevardata*NonMuTypetypeNonMuTypestruct{list[]int}func(data*MuType)add(iint,w

  9. go - "selective"goroutines 互斥 - 2

    我是Go的新手,我想实现一个自定义的互斥机制,每个应用程序用户一次可以执行一个goroutine。为简化起见,将U1和U2视为应用程序用户以及F1(userId)、F2(userId)和F3(userId)三个不同的goroutine,它们从数据库读取/写入记录仅与给定用户相关.我希望,如果U1调用(F1、F2、F3)、(F2、F3)在F1结束之前不执行,那么执行F2或F3(按调用顺序将是最佳解决方案),最后剩下的被执行。U2不受U1锁的影响,但如前所述,她由自己的锁控制。你将如何实现?有内置的原语吗?谢谢 最佳答案 使用sync.

  10. go - 从接收端关闭 channel : deadlock when accessing sync. 来自多个 goroutine 的互斥量 - 2

    我正在尝试从接收端实现优雅的channel关闭。是的,我知道这违反了channel关闭规则:...don'tcloseachannelfromthereceiversideanddon'tcloseachannelifthechannelhasmultipleconcurrentsenders.但是我想实现这样的逻辑。不幸的是,我在很多情况下都没有陷入死锁问题:应用程序只是无限期地挂起,试图再次锁定相同的锁定Mutex。所以,我有2个协程:将写入channel的一个另一个将接收数据+将从接收端关闭channel。我的channel用sync.Mutex和closedbool标志包裹在结

随机推荐