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

可以安全地重用sync.WaitGroup吗?

尉迟雅昶
2023-03-14
问题内容

sync.WaitGroup后可重复使用Wait()被称为?

func worker(who string, in <-chan int, wg *sync.WaitGroup) {
    for i := range in {
        fmt.Println(who, i)
        wg.Done()
    }
}

func main() {
    var wg sync.WaitGroup

    AIn := make(chan int, 1)
    BIn := make(chan int, 1)

    go worker("a:", AIn, &wg)
    go worker("b:", BIn, &wg)

    for i := 0; i < 4; i++ {
        wg.Add(2)
        AIn <- i
        BIn <- i
        wg.Wait()
        fmt.Println("main:", i)
    }
}

这play.golang.org/p/QLsvA-b4Ae按预期运行,但它保证是安全的吗?文档没有这么说,但也许我只是偏执。


问题答案:

是的,这很安全。实际上,它比这更安全。您可以同时Wait从多个goroutine中进行选择,并可以根据您的用例进行适当的互换AddDone调用。只要Add发生在之前Wait,您就应该是安全的。

出于好奇,现在WaitGroup使用互斥锁,两个int32s计数器和一个信号量来实现:

type WaitGroup struct {
        m       Mutex
        counter int32
        waiters int32
        sema    *uint32
}

这也是一个有趣的测试:

var wg1, wg2 sync.WaitGroup
wg1.Add(1)
wg1.Done()
wg1.Wait()
fmt.Println(wg1 == wg2) // Prints true

最后,如果您发现这种用法有任何问题,请报告,因为这将是一个错误。



 类似资料:
  • 我的问题是:在实现解析方法时,什么是最好的?直接调用数据存储库或回调主解析器(即实现)的解析器(前提是它具有适当的方法)?换句话说(参见下面的示例),在回调主解析器时,是否正确调整/设置? 注意:如果您不熟悉如何使用GraphQL Java工具,我就让您看看@https://www.graphql-java-kickstart.com/tools/schema-definition/ 现在来举个例

  • 我们的许多代码是遗留的,但我们正在向“大数据”后端移动,我试图传播更新的API调用,鼓励使用最新的Spring库等。我们的问题之一是应用程序层ID生成。出于我不明白的原因,一个更高的权威想要序列的biginteger。我本可以在失败的插入中使用重新生成和重新尝试使它们随机,但我确实被否决了。 附言。我仍然认为我的随机生成的想法比处理所有这些线程的东西要好。大整数是一个大得离谱的数字,两次生成相同的

  • 问题内容: 关于以下方面,在Linux / gcc上的C ++中使用longjmp和setjmp是否安全? 异常处理(我没有使用longjmp / setjmp实现异常处理。我想知道longjmp / setjmp对标准异常处理有哪些副作用) 指针 讯号 智能指针(boost的共享和侵入指针) 您还能想到的其他任何东西。 问题答案: / 完全颠覆了堆栈展开,因此也破坏了异常处理以及RAII(通常是

  • 问题内容: 我需要开发一个可长期离线运行的Web应用程序。为了使它可行,我无法避免将敏感数据(个人数据,而不是您将仅存储散列数据的类型)保存在本地存储中。 我接受不建议这样做,但是我几乎没有选择要执行以下操作来保护数据: 使用斯坦福JavaScript加密库和AES-256将所有内容都加密到本地存储中 用户密码是加密密钥,未存储在设备上 通过ssl从单个受信任的服务器提供所有内容(在线时) 使用o

  • 我有一个问题要问这里的JVM内部专家。 在Java虚拟机中,对象内容存储在堆内存中,直到被垃圾回收为止。通常,GC是在没有更多可用内存的情况下发生的,因此如果JVM有大量可用空间,那么GC发生之前可能需要很长时间。 从安全的角度来看,您能想象有人访问JVM内存并获得堆空间的转储,在那里可以找到等待GC的未使用对象吗? 我的意思是:如果我的程序处理敏感数据,并且在执行涉及这些敏感对象的过程后,我的应

  • 问题内容: 我正在开发JSON / REST Web API,为此,我特别希望第三方网站能够通过AJAX调用我的服务。因此,我的服务正在发送著名的CORS标头: 允许第三方站点通过AJAX调用我的服务。到目前为止一切都很好。 但是,我的Web api的一个子部分是非公开的,需要身份验证(带有OAuth和access_token cookie的相当标准的东西)。在我网站的此部分也启用CORS是否安全