前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sync.Mutex 与 sync.WaitGroup 使用示例

sync.Mutex 与 sync.WaitGroup 使用示例

作者头像
一个会写诗的程序员
发布2022-05-13 15:06:12
6720
发布2022-05-13 15:06:12
举报
文章被收录于专栏:一个会写诗的程序员的博客

使用 sync.Mutex 与 sync.WaitGroup

线程不安全的用法:

代码语言:javascript
复制
{
    var wg sync.WaitGroup
    count := 0
    for i := 0; i < 10; i++ {
        // wg add 1 goroutine
        wg.Add(1)
        // goroutine
        go func() {
            defer wg.Done()
            for i := 0; i < 10000; i++ {
                // unsafe increment
                count++
            }
        }()
    }

    wg.Wait()
    fmt.Println(count)
}

加锁,线程安全:

代码语言:javascript
复制
{
    var myLock sync.Mutex
    var wg sync.WaitGroup
    count := 0
    for i := 0; i < 10; i++ {
        // wg add 1 goroutine
        wg.Add(1)
        // goroutine
        go func() {
            defer wg.Done()
            for i := 0; i < 10000; i++ {
                // safe increment
                myLock.Lock()
                count++
                myLock.Unlock()
            }
        }()
    }

    wg.Wait()
    fmt.Println(count)
}

其中一个运行输出: 53546 100000

自定义一个safe Counter

代码语言:javascript
复制
package counter

import (
    "log"
    "sync"
)

type Counter struct {
    mu    *sync.Mutex
    Value int
}

func NewCounter(value int) *Counter {
    return &Counter{
        new(sync.Mutex), 0,
    }
}

func (c *Counter) Increment() {
    c.mu.Lock()
    // defer func
    defer func() {
        c.mu.Unlock()
        log.Printf("mu sync.Mutex Unlocked!")
    }()
    // safe increment Value
    c.Value++
}

使用 safe Counter

代码语言:javascript
复制
{
    var wg sync.WaitGroup
    count := counter.NewCounter(0)
    for i := 0; i < 10; i++ {
        // wg add 1 goroutine
        wg.Add(1)
        // goroutine
        go func() {
            defer wg.Done()
            for i := 0; i < 10000; i++ {
                // safe increment
                count.Increment()
            }
        }()
    }

    wg.Wait()
    fmt.Println(count.Value)
}

正确输出: 100000

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用 sync.Mutex 与 sync.WaitGroup
  • 自定义一个safe Counter
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档