GoLang Channel与mutex的选择,性能差不多

原创 2015年11月17日 17:37:27

go官方应该是更推荐使用chan
https://github.com/golang/go/wiki/MutexOrChannel

以下代码用于测试性能 — 不确保思路是正确的。

package main

import (
    "fmt"
    "sync"
    "time"
)

type Op struct {
    key int
    val int
}

var lock sync.Mutex

var m1 map[int]int
var m2 map[int]int
var max int = 50000

func update_map_by_mutex(i int) {
    lock.Lock()
    m1[i] = i
    if len(m1) == max {
        fmt.Printf("%s mutex finish\n", time.Now())
    }
    lock.Unlock()
}

var ch chan Op

func update_map_by_chan(i int) {
    ch <- Op{key: i, val: i}
}

func wait_for_chan(m map[int]int) {
    for {
        select {
        case op := <-ch:
            m[op.key] = op.val
            if len(m2) == max {
                fmt.Printf("%s chan finish\n", time.Now())
                return
            }
        }
    }
}

func main() {

    m1 = make(map[int]int, max)
    m2 = make(map[int]int, max)
    ch = make(chan Op)
    go wait_for_chan(m2)
    for i := 0; i < max; i++ {
        go update_map_by_chan(i)
        go update_map_by_mutex(i)
    }

    time.Sleep(time.Second * 1)
}

输出结果:

2015-11-17 17:08:18.06992 +0800 CST mutex finish
2015-11-17 17:08:18.0709215 +0800 CST chan finish

mutex性能略好,但chan更go化,更推荐。

golang中读写锁RWMutex和通用锁Mutex的使用

golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex ...

golang中sync.RWMutex和sync.Mutex区别

golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex  ...

golang sync mutex 互斥锁

golang的多线程固然好用,但是有时候需要对数据进行上锁,防止数据被其它线程更改。那么sync包下的Mutex非常好用。 Mutex是一个互斥锁。可以作为struct的一部分,这样这个stru...

[Golang]互斥到底该谁做?channel还是Mutex

channel– 本质上是一个 MessageQueue– 非常正统的执行体间通讯设施• sync.Mutex/RWMutex/Cond/etc– 不要把 channel 当做万金油,该 Mute...

golang channel的设计瑕疵

golang channel深度剖析
  • D_Guco
  • D_Guco
  • 2017年08月26日 18:51
  • 2633

对golang的Channel初始化的有缓存与无缓存解释

首先编程的时候遇到疑问,输出跟我所想预想不一样,后来查到了golang社区的帖子,其中一篇帖子 :健哥大人  做出了一些解释。 我摘抄重点过来: 无缓冲的与有缓冲channel有着重大差别,那...

golang控制channel的出入口

golang控制channel的出入口我们常常使用channel来在多个goroutine之间做数据通讯,但是chan作为函数的入参我们应该怎么写呢?也许有人觉得这个问题比较傻,不过这个还真的是我今天...

golang中并发sync和channel

golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决...

Golang Channel 整理

Golang Channel 整理 一Golang并发基础理论 二Go Channel基本操作语法 三Channel用作信号Signal的场景 1等待一个事件Event 2协同多个Goroutines...

Golang的select/非缓冲的Channel实例详解

select golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。 在执行select语句的时候,运行时系统会自上而下地判断每个case中的发送或接...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GoLang Channel与mutex的选择,性能差不多
举报原因:
原因补充:

(最多只允许输入30个字)