Go语言中文网 为您找到相关结果 233

Golang之Mutex

引用 sync.mutex 源代码分析 Golang 中 Mutex 的源码实现 建议阅读 Golang中Mutex的实现 图解Go里面的互斥锁mutex了解编程语言核心实现源码 互斥锁有两种状态:正常状态和饥饿状态。 在正常状态下,所有等待锁的goroutine按照FIFO顺序等待。唤醒的goroutine不会直接拥有锁,而是会和新请求锁的goroutine竞争锁的拥有。新请求锁的goroutine具有优势:它正在CPU上执行,而且可能有好几个,所以刚刚唤醒的goroutine有很大可能在锁竞争中失败。在这种情况下,这个被唤醒的goroutine会加入到等待队列的前面。 如果一个等待的goroutine超过1ms没有获取锁,那么它将会把锁转变为饥饿模式。 在饥饿模式下,锁的所有权将从unl...阅读全文

博文 2020-05-12 01:32:52 网管同学

28. 学习 Go 协程:互斥锁和读写锁

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 在 「19. 学习 Go 协程:详解信道/通道」这一节里我详细地介绍信道的一些用法,要知道的是在 Go 语言中,信道的地位非常高,它是 first class 级别的,面对并发问题,我们始终应该优先考虑使用信道,如果通过信道解决不了的,不得不使用共享内存来实现并发编程的,那 Golang 中的...阅读全文

博文 2020-06-05 09:34:21 王一白

golang defer 使用小结与注意要点

关于延时调用函数(Deferred Function Calls) 延时调用函数的语法如下: defer func_name(param-list) 当一个函数调用前有关键字 defer 时, 那么这个函数的执行会推迟到包含这个 defer 语句的函数即将返回前才执行. 例如: func main() { defer fmt.Println("Fourth") fmt.Println("First") fmt.Println("Third") } 最后打印顺序如下: First Second Third 需要注意的是, defer 调用的函数参数的值 defer 被定义时就确定了.例如: i := 1 defer fmt.Println("Deferred print:", i) i++ f...阅读全文

通过例子来学习 Go 和 Rust ---- RwLock 读写锁

读写锁顾名思义就是只允许单进程同时写,在数据没有被写的情况下允许多进程同时读,的锁。 rust 里和 Mutex 类似,使用RAII(Resource Acquisition Is Initialization)来保证在值被Drop的时候自动解锁。而 go 里依然是需要手动解锁。 举个改写自Go标准库测试的栗子 import ( . "sync" "sync/atomic" ) const NumIterations = 1000 const NumReaders = 1000 func writer(rwm *RWMutex, activity *int32, cdone chan bool) { for i := 0; i < NumIterations; i++ { rwm.Lock(...阅读全文

博文 2020-03-06 11:33:22 Tericoder

golang源码学习之RWMutex

读写锁(RWMutex)是在互斥锁(Mutex)的基础上构建的。Mutex笔记见另一篇 那么为什么需要读写锁呢?试想一下,在读多写少的场景下,mutex只允许一个goroutine进行读操作,而读操作往往是不会修改目标数据的。那我们为什么不允许多个goroutine并发执行读操作以提高效率呢,所以就有了读写锁。读锁和写锁互斥,但读锁和读锁不互斥。 下面是读锁和写锁的兼容性,是不是很像innoDB的排他锁和共享锁呢 . rlock lock rlock v x lock x x 数据结构 type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // 唤醒写锁的信号 readerSem...阅读全文

Golang学习笔记之互斥锁(Mutex)

Go语言包中的sync包提供了两种锁,互斥锁(sync.Mutex)和读写锁(sync.RWMutex) 这一篇博文我们只说一下互斥锁。 Mutex是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex类型的锁和线程无关,可以由不同的线程加锁和解锁。 • 它只有两个公开方法:Lock()加锁,unlock()解锁。 • 在同一个协程中加锁后,不能再继续对其加锁,否则会panic。只有在解锁之后才能再次加锁。 • 只允许只有一个读或者写的场景 • 在使用Unlock()解锁前,未使用Lock()加锁,就会引起一个运行错误。 函数原型 func (m *Mutex) Lock() Lock方法锁住m,如果m已经加锁,则阻塞直到m解锁。 func (m *Mutex) Unlock(...阅读全文

博文 2018-12-13 21:34:47 学生黄哲

golang 不定参数列表

package main import "fmt" func func1(a, b int) (result int) { /* 输入两个参数,返回两个参数相加的结果 */ result = a + b return } // 不定参数列表 func func2(args ...int){ //js 解构 for _, data := range args{ fmt.Println(data) } } func main() { //result := func1(333, 333) //fmt.Printf("result = %d\n", result) //func2(1,2,3,4,5,6,) func2() ...阅读全文

博文 2020-04-05 02:32:43 小麦客

accounts.go

package accounts import ( "math/big" ethereum "github.com/ethereum/go-ethereum-test" "github.com/ethereum/go-ethereum-test/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum-test/event" ) // 一个账号是20个字节的数据。 URL是可选的字段。 type Account struct { Address common.Address `json:"address"` // Ethereum帐户地址 AddressLength = 20 U...阅读全文

博文 2018-08-31 18:22:07 BigJeffWang

Golang 基础

1. log(github.com/sirupsen/logrus) log.Fatal 会直接中断当前服务, 即使是用 go func(){log.Fatal("end")}() 也会中断整个服务 2. goroutine 并发线程有3种模型(用户空间 - 系统空间): 内核级线程模型 1(系统线程-轻量级线程):1(用户线程) context switch 性能低 用户级线程模型 1(系统线程-轻量级线程):N(用户线程) context switch 成本低(实际由于无法有效利用多处理器, 效率低) 混合型线程模型 N(系统线程-轻量级线程):M(用户线程) golang的goroutine(coroutine)语义实现了此模型 3. channel FIFO(管道先进先出) for ...阅读全文

博文 2019-05-31 13:34:41 哓晓的故事

go sema 源码分析

sema.go semacquire1和 semrelease1 函数是 sync.mutex 用来阻塞 g 和释放 g 的实现,这两个方法也实现了类似信号量的功能,并且是针对 goroutine 的信号量,由于还没看 go 调度相关的代码,sema 里跟调度相关的逻辑也不做仔细说明和代码注解 semacquire1 函数 大致流程:获取 sudog 和 semaRoot ,其中 sudog 是 g 放在等待队列里的包装对象,sudog 里会有 g 的信息和一些其他的参数, semaRoot 则是队列结构体,内部是堆树,把和当前 g 关联的 sudog 放到 semaRoot 里,然后把 g 的状态改为等待,调用调度器执行别的 g,此时当前 g 就停止执行了。一直到被调度器重新调度执行,会首...阅读全文

博文 2019-12-26 12:34:19 少年pi啊

Golang 中 Mutex 的源码实现

本文基于 go1.11 版本。 Mutex 使用 在深入源码之前,要先搞清楚一点,对 Golang 中互斥锁 sync.Mutex 的操作是程序员的主动行为,可以看作是是一种协议,而不是强制在操作前必须先获取锁。 这样说可能有点抽象,看下面这段代码: package main import ( "fmt" "sync" "time" ) type People struct { mux sync.Mutex Name string Age uint8 } func (p *People) IncAge() { p.mux.Lock() time.Sleep(3 * time.Second) p.Age++ p.mux.Unlock() } func main() { leo := &Peop...阅读全文

博文 2018-09-29 18:34:39 LLLeon

Go 博客平台 Pipe 1.8.3 发布,支持 PJAX

[Pipe](https://github.com/b3log/pipe) 是一款小而美的开源博客平台,使用 golang、Vue.js 编写。 v1.8.3 主要是支持了前台主题的 PJAX。 ### 安装 [下载](https://pan.baidu.com/s/1jHPtHLO)最新的 Pipe 包解压,进入解压目录直接运行 pipe/pipe.exe 可执行文件即可。 从 1.8.2 升级只需将已有的配置拷贝覆盖即可,启动后会自动升级。 ### 文档 * [Pipe 用户指南](https://hacpai.com/article/1513761942333) * [Pipe 开发指南](https://hacpai.com/article/1533965022328) * [Pip...阅读全文

浅解 go 语言的 interface

我写了一个 go interface 相关的代码转换为 C 代码的样例。也许有助于大家理解 go 的 interface。不过请注意一点,这里没有完整解析 go 语言 interface 的所有细节。 Go 代码: package main import "fmt" // ------------------------------------------------------------- type IReadWriter interface { Read(buf *byte, cb int) int Write(buf *byte, cb int) int } // ------------------------------------------------------------...阅读全文

博文 2015-06-17 23:00:26 xushiweizh

Golang 之 defer

关于延时调用函数(Deferred Function Calls) 延时调用函数的语法如下: defer func_name(param-list) 当一个函数调用前有关键字 defer 时, 那么这个函数的执行会推迟到包含这个 defer 语句的函数即将返回前才执行. 例如: func main() { defer fmt.Println("Fourth") fmt.Println("First") fmt.Println("Third") } 最后打印顺序如下: First Second Third 需要注意的是, defer 调用的函数参数的值 defer 被定义时就确定了. 例如: i := 1 defer fmt.Println("Deferred print:", i) i++ ...阅读全文

博文 2016-08-19 13:00:00 xys1228

bottos 安装和使用

环境搭建 下载大于1.11版本的golang 配置GOPATH 将代码拷贝到$GOPATH/src/github.com目录下 进入到代码目录运行: $go build 在代码根目录会生产一个bottos的可执行文件 进入到bcli目录 $cd bcli 编译bcli $go build 这样会在bcli目录下生产一个bcli的可执行文件 节点启动 通过对代码的编译,会得到bottos和bcli这2个可执行文件,bottos是用于启动节点的,bcli通过restful API和节点进行通信的命令行工具,它的功能包括,查看区块数据,创建帐户,发交易等 配置文件:config.toml 和 genesis.toml config.toml: # Configuration for Bottos ...阅读全文

博文 2018-10-30 21:34:42 studyBlockChain

浅谈go语言中的读写锁和互斥锁

Hello,各位小伙伴大家好,我是小栈君,近期气温有所下降,希望各位小伙伴记得防寒保暖,不要感冒了哦。 本期分享主题是关于go语言中的锁的应用场景,以及为各位小伙伴介绍实战应用中最为广泛的读写锁和互斥锁。 互联网生态的日益繁荣,人们的生活便利得到了极大的提高,通过网上操作我们基本上可以实现很多需求。 网站疯狂访问的背后应对的是一波接一波的挑战。所以在应对系统的稳定和并发的时候,程序中的“锁”就孕育而生。 互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 也就是将共享资源变成独占资源。互斥锁的应用场景通常是写大于读操作的,它不同于读写锁的读者随意访问,而写者只有一个。 它...阅读全文

博文 2019-11-29 19:34:28 IT干货栈

图解Go中select语句的底层原理

Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。 还有人说:select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。 以上说法都正确。 I/O多路复用 我们来回顾一下是什么是I/O多路复用。 普通多线程(或进程)I/O image 每来一个进程,都会建立连接,然后阻塞,直到接收到数据返回响应。 普通这种方式的缺点其实很明显:系统需要创建和维护额外的线程或进程。因为大多数时候,大部分阻塞的线程或进程是处于等待状态,只有少部分会接收并处理响应,而其...阅读全文

博文 2019-04-06 14:34:39 RyuGou

23.蛤蟆笔记go语言——PostgrelSQL驱动使用

23.蛤蟆笔记go语言——PostgrelSQL驱动使用 创建数据库用户表 #create database test; # create user astaxie with password 'astaxie'; CREATE TABLE userinfo ( uid serialNOT NULL, usernamecharacter varying(100) NOT NULL, departnamecharacter varying(500) NOT NULL, Createddate, CONSTRAINTuserinfo_pkey PRIMARY KEY (uid) ) WITH (OIDS=FALSE); CREATE TABLE userdeatail ( uidinteger,...阅读全文

博文 2016-06-29 00:00:00 notbaron

Golang中的RWMutex相关

关于sync.RWMutex 关于优先级 为了模拟pthread中的barrier,在代码中使用了RWMutex配合阻塞管道.而其中一个关键问题就是读锁与写锁的优先级问题. 文档里面有这样一句话:a blocked Lock call excludes new readers from acquiring the lock. 所以我们可以看到,一个阻塞的写锁会阻止新的读者请求读锁. 总结一下,我们可以将程序分阶段来阐述这个行为. N个读者添加N个读锁 一个写者试图添加写锁被阻塞 后续读者无法成功获取读锁. N个读锁全部解锁 写锁被唤醒,完成写操作,解除写锁 后续读者被唤醒,获得读锁,完成读操作 测试代码 : package main import "fmt" import "time" im...阅读全文

博文 2017-06-10 00:00:02 xinglong

WSL ubuntu中更新go语言

1、删除原有go语言 sudo rm -rf /usr/local/go 2、下载最新linux版go语言 https://golang.org/dl/ 3、拷贝到本地执行解压 cp /mnt/d/go*linux-amd64.tar.gz ~/ sudo tar -C /usr/local -xvf go*linux-amd64.tar.gz 4、如果以安装过go语言,执行以下命令显示安装情况: go version 5、如果首次安装go语言,在~/.bash_profile中加入以下变量: export PATH="$PATH:/usr/local/go/bin:$GOPATH/bin" 并执行以下命令: ~/.bash_profil...阅读全文

博文 2020-01-18 15:32:42 渣渣曦

兄弟连区块链入门教程eth的账户和基本单位

我们在命令行输入 eth.accounts 可以看到当前该区块链中共有几个账号,以及每个账号的公钥地址。在eth系统中,状态是由被称为“账户”(每个账户由一个20字节的地址)的对象和在两个账户之间转移价值和信息的状态转换构成的。eth的账户包含四个部分:随机数,用于确定每笔交易只能被处理一次的计数器账户目前的以太币余额账户的合约代码,如果有的话账户的存储(默认为空)简单地说,每一个eth账户都有一对公钥和私钥组成。公钥我们可以理解为就是账户地址,任何其他账户都可以访问该地址私钥可以理解为一段加密过的密码,这一对公钥和私钥共同组成一个唯一标示的eth账户。例如在上节我们建立的第一个eth账户 eth.accounts[0] 中,地址 0xbcf5b841303bc08026ce2d3b8f83...阅读全文

博文 2018-10-25 16:34:42 兄弟连区块链培训

Golang、python关于压缩和解压的解释。

golang中,存在 "compress/zlib" 这个包,里面包含各压缩解压的各项设置,比如压缩级别/压缩速度。 比如 zlib包里面的常量如下: const ( NoCompression = flate.NoCompression //没有压缩 BestSpeed = flate.BestSpeed //压缩速度 BestCompression = flate.BestCompression //压缩率 DefaultCompression = flate.DefaultCompression//默认压缩 ) 压缩速度和压缩率这两个是一个相互矛盾的过程,这里面的取舍还是需要各位去仔细甄别使用场景。 func main() { b := []byte(`china GO GO !!!的...阅读全文

博文 2017-03-15 18:00:20 大洋的顶端

Go sync.Map 看一看

偶然看见这么篇文章:一道并发和锁的golang面试题。虽然年代久远,但也稍有兴趣。 正好最近也看到了 sync.Map,所以想试试能不能用 sync.Map 去实现上述的功能。 我还在 gayhub上找到了其他人用 sync.Mutex 的实现方式,【点击这里】。 归结一下 需求是这样的: 在一个高并发的web服务器中,要限制IP的频繁访问。现模拟100个IP同时并发访问服务器,每个IP要重复访问1000次。每个IP三分钟之内只能访问一次。修改以下代码完成该过程,要求能成功输出 success: 100。 并且给出了原始代码: package main import ( "fmt" "time" ) type Ban struct { visitIPs map[string]time.Tim...阅读全文

博文 2019-03-26 14:34:41 cookedsteak

GO源码学习之channel

前言 channel是golang中标志性的概念之一,很好很强大! channel(通道),顾名思义,是一种通道,一种用于并发环境中数据传递的通道。通常结合golang中另一重要概念goroutine(go协程)使用,使得在golang中的并发编程变得清晰简洁同时又高效强大。 今天尝试着读读golang对channel的实现源码,拿起我生锈的水果刀,装模作样的解剖解剖这只大白老鼠。 channel基础结构 type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array o...阅读全文

博文 2018-07-19 12:34:47 tinywell

golang之defer

点击上方蓝色字体关注我们golang 中的延迟调用函数延迟调用函数(Deferred Function Calls)的调用方式如下:defer func_name(param-list)1 执行的时机func f1() (ret int) {defer func() {ret++}()return 0} func f2() (ret int) {tmp := 1defer func() {tmp = tmp + 10}()return tmp} func f3() (ret int) {defer func(ret int) {ret = ret + 10}(ret)return 1} 先不要运行程序,心里记下自己认为分别运行这三个函数的结果,然后我们慢慢分析。这里先说结论:网上有篇博文讲的...阅读全文

博文 2016-10-20 12:00:04 u012798391

golang之sync.Mutex互斥锁源码分析

image 针对Golang 1.9的sync.Mutex进行分析,与Golang 1.10基本一样除了将panic改为了throw之外其他的都一样。 源代码位置:sync\mutex.go。 可以看到注释如下: Mutex can be in 2 modes of operations: normal and starvation. In normal mode waiters are queued in FIFO order, but a woken up waiter does not own the mutex and competes with new arriving goroutines over the ownership. New arriving goroutines h...阅读全文

博文 2018-07-29 23:34:48 freelang

Go 其他特性

Go 其他特性 为了保持 Go 语法介绍的完整性,有一些 Go 独有的特性,并没有在前面的章节介绍。说 Go 独有的特性其实并不恰当,因为其他语言并非在语言层面定义上下面的几个特性。 本节想介绍的关键字与函数包括 defer, append, close, make, new, copy, delete,只有第一个是关键字,后6个都是内置函数。 defer defer 是 Golang 中的广义的通用析构函数。析构函数是在Java,C++类中所定义的一类在类被销毁时执行收尾的函数。什么叫收尾,就是类似于离家出门前总是要锁门;下班了总是要打卡这样一类,默认都需要在结束时做的事情。在函数结束时,哪些工作需要收尾呢? 打开的文件要关闭,不管发生读写任何操作; 打开的网络连接要关闭,不管你访问了哪些...阅读全文

博文 2018-11-26 17:34:44 PRE_ZHY

Golang channel 之 读操作 recv

上一篇:Golang channel 之 写操作 send channel的常规读操作 假如有一个元素类型为int的channel,变量名为ch,那么常规的读操作(简称recv为读)在代码中的写法如下所示: // 将结果丢弃 <-ch // 将结果赋值给变量v v := <-ch // comma ok style,ok为false表示ch已关闭且v不是“读出来的” v, ok := <-ch 其中ch可能是“有缓冲”的,也可能是“无缓冲”的,甚至可能为nil。 按照上面的写法,有两种情况能使读操作不会阻塞: 1)通道ch的sendq里已有goroutine在等待; 2)通道ch的sendq是空的,但是通道“有缓冲”且缓冲区中有数据。 第一种情况中,只要ch的sendq里有协程在排队,那么需...阅读全文

博文 2019-12-23 21:32:42 封幼麟

以太坊学习笔记-从环境搭建到hello ethereum

以太坊入门学习笔记原文发布于:区块链项目导航:首先默认安装完成Ubuntu16.04环境。注:需要获得root用户,按照以下步骤:sudo passwd -u root输入密码sudo passwd root设置root用户密码安装必要环境gitsudo apt-get install git跳出对话输入:Y(下面类同)安装完成后查看git版本git version如图: Curl安装Curlsudo apt-get install curlcurl -sL https://deb.nodesource.com/setup_6.x | sudo -E bashNodeJS安装NodeJSsudo apt-get install -y nodejs安装完成后查看NodeJS版本nodejs -...阅读全文

博文 2018-06-19 10:34:39 磨链社区

由浅入深聊聊Golang中select的实现机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011957758/article/details/82230316 #正文 话说今天在玩select的时候发现一个问题,是这样的: 片段1: func main(){ var count int for { select { case <-time.Tick(time.Millisecond * 500): fmt.Println("咖啡色的羊驼") count++ fmt.Println("count--->" , count) case <-time.Tick(time.Millisecond * 499) : fmt.Println(time.Now().Unix()) count++...阅读全文

博文 2019-01-10 17:31:35 u011957758

优化 Go 中的 map 并发存取

Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource。每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁,并且是跨多个协程的,因此我们必须要考虑同步。 该函数从 map[string]*metricSource 中根据指定的 name 获取一个指向 metricSource 的指针,如果获取不到则创建一个并返回。其中要注意的关键点是我们只会对这个 map 进行插入操作。 简单实现如下:(为节省篇幅,省略了函数头和返回,只贴重要部分) var source *memorySource var present bool p.lock.Lock() // lock the mutex defer p.l...阅读全文

博文 2016-08-18 15:00:13 hou512504317

浅谈 Golang sync 包的相关使用方法

预览目录 为什么需要锁? 什么是互斥锁 Mutex? 什么是读写锁 RWMutex? WaitGroup 例子 Cond 条件变量 Pool 临时对象池 Once 执行一次 尽管 Golang 推荐通过 channel 进行通信和同步,但在实际开发中 sync 包用得也非常的多。另外 sync 下还有一个 atomic 包,提供了一些底层的原子操作(这里不做介绍)。本篇文章主要介绍该包下的锁的一些概念及使用方法。 整个包都围绕这 Locker 进行,这是一个 interface: type Locker interface { Lock() Unlock() } 只有两个方法,Lock() 和 Unlock()。 另外该包下的对象,在使用过之后,千万不要复制。 有许多同学不理解锁的概念,下面...阅读全文

博文 2017-08-27 17:54:36 Deepzz's Blog

币币合约执行解析(包含部分源码)

比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本文解析的为比原提供的币币合约 模板如下: contract TradeOffer(assetRequested: Asset, amountRequested: Amount, seller: Program, cancelKey: PublicKey) locks offered { clause trade() requires payment: amountRequested of assetRequested { lock payment with seller unlock offered } claus...阅读全文

博文 2018-09-17 12:34:45 比原链Bytom

IntelliJ IDEA 安装golang 插件

作者的机器为mac OS 用户首先需要在自己的个人机器上安装好 golang 的环境,详细可以参考 hyperledger fabric 1.0.5 分布式部署 (一)安装 golang 的部分。 然后用户需要登陆 IDEA 的官网下载新版的golang 插件,下载地址:IDEA golang插件 安装 golang 插件 用户在打开 IDEA 工具后,可以选择 "Configure" -> "Plugins" 选择 "Install plugin from disk ..",再选择刚才下载的IDEA golang 插件压缩包(注意:压缩包无需解压)。 如果用户下载的插件无法直接安装,那么有可能是IDEA 版本和插件版本无法匹配,用户也可以选择直接通过IDEA 进行下载。 无论用户使用哪种方...阅读全文

博文 2018-03-09 14:30:01 chenfool

Go36-26-互斥锁与读写锁

从同步讲起 相比于Go语言宣扬的“用通讯的方式共享数据”,通过共享数据的方式来传递信息和协调线程运行的做法其实更加主流。本篇就是讨论一些与多线程、共享资源以及同步有关的知识。 sync包,就是一个与并发编程关系紧密的代码包。这里“sync”的中文意思就是“同步”。 重要的并发编程概念 这里会讲一些重要的并发编程概念:竞态条件、临界区、互斥量、死锁。死锁会在互斥锁里引出。 一旦数据被多个线程共享,那么就很可能会产生争用和冲突的情况。这种情况也被称为竞态条件(race condition),这往往会破幻共享数据的一致性。 概括来讲,同步的用途有两个: 避免多个线程在同一时刻操作同一个数据块 协调多个线程,避免它们在同一时刻执行同一个代码块 由于这样的数据块和代码块的背后都隐含着一种或多种资源,可...阅读全文

博文 2019-01-24 22:35:13 骑士救兵

Golang学习(7)——sync包

Golang学习 - sync 包--------------------临时对象池 Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要的时候取出来重复使用,目的是为了避免重复创建相同的对象造成 GC 负担过重。其中存放的临时对象随时可能被 GC 回收掉(如果该对象不再被其它变量引用)。 从 Pool 中取出对象时,如果 Pool 中没有对象,将返回 nil,但是如果给 Pool.New 字段指定了一个函数的话,Pool 将使用该函数创建一个新对象返回。Pool 可以安全的在多个例程中并行使用,但 Pool 并不适用于所有空闲对象,Pool 应该用来管理并发的例程共享的临时对象,而不应该管理短寿命对象中的临时对象,因为这种情况下内存不能很好的分配,这些短寿命对象应该自己实现空...阅读全文

博文 2017-02-09 18:26:31 1160636144

EOS账户权限

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 账户和权限钱包账户授权和权限其他默认账户配置(单个签名)多签名账户和自定义权限帐户是存储在区块链中的人类可读标识符。 每个交易都根据配置的帐户权限对其权限进行评估。 每个已命名的权限都有一个阈值,必须满足该权限下签署的交易才能被视为有效的阈值。 交易 通过使用已经安装和解锁钱包的客户端来签署。 钱包是保护和利用你的密钥的软件。 这些密 钥可能授权也可能不授权区块链上的账户权限。 钱包钱包是一个存储可能与账户有关的密匙的客户端。通常情况下,钱包有锁定和解锁两种状态并通过 一个高熵密码保护。EOSIO/eos库有一个名为cleos的命令行界面客户端,它与一个名为keosd的 lite客户端进行交互,并且共同展示了钱包...阅读全文

博文 2019-09-16 11:02:50 链客

有一个sync互斥锁的问题!为什么第一个1锁定后第2个goroutine 也可以锁定

![WF1005R`[A`3HG~59U]CR61.png](https://static.studygolang.com/171105/c8d5ffeb8c2370b965d9eebbc7baae8d.png) 一共3个goroutine 第一个锁定 然后wait睡眠,第二个 第三个怎么任然可以锁定!!互斥锁的规则不是只能一个锁定,解锁后 才能给下一个goroutine 锁定吗? ![prmf.png](https://static.studygolang.com/171105/e2fea4965e7e2b6a7e076a6bac0e4b65.png...阅读全文

Go博客平台Pipe 1.8.2发布,支持GitHub登录

Pipe 是一款小而美的开源博客平台,使用golang、Vue.js编写。v1.8.2主要支持了通过GitHub登录,并修复了一些细节缺陷,建议在用老版本的用户进行更新。安装:下载最新的Pipe包解压,进入解压目录,直接运行pipe/pipe.exe可执行文件即可。从1.8.1升级,只需将已有的配置,拷贝覆盖即可,启动后会自动升级。项目:GitHub:https://github.com/b3log/pipe码云:https://gitee.com/dl88250/pipe1.8.2变更记录支持GitHub登录;站点标题过长问题;博客标签挡住了输入的内容...阅读全文

博文 2018-10-19 13:34:39 苍山落暮

手把手教你,COS公链互动操作!

作为领先的内容公链,COS公链的代码全部开源免费。开源地址:https://github.com/coschain/ 看过上一篇文章《0基础,开启COS公链本地化运行》的朋友,相信已经在本地搭建了COS公链。这次,我们开启COS公链互动模式,看看都有哪些好玩儿的互动? 区别于中心化的内容平台,Contentos内容生态里的账户系统分为“本地账户”和“链上账户”两种。 本地账户是一份 keystore 文件,放置在 ~/.coschain文件夹下。一个本地账户存储了一对 contentos 的公私钥,这个keystore 文件可以被 wallet 创建或者导入。 一份本地的 keystore 文件类似如下: { "Name":"testuser", "PubKey":"COS745h9zeER...阅读全文

博文 2019-11-20 17:02:45 内容链Contentos

用 golang 实现区块链系列四 | 交易 1

介绍 交易是比特币的核心,而且区块链的唯一目标就是安全可靠地存储交易信息,而且没人可以在它们被创建之后修改它们。今天我们要开始实现交易。但是由于这是一个比较大的话题,因此我会分成两个部分:这一部分,我们会实现交易的通用机制,在第二部分会继续完成细节部分。 由于代码变化会比较大,所以没有必要全部都解释一下,你可以在这里找到所有的变化。 没有勺子 如果你曾经做个 web 应用,为了实现支付系统,可能会在数据库里创造这么几个表: accounts 和 transactions。账户表会存储用户信息,包括个人信息和余额,另一个交易标会存商品中关于钱从哪个账户转给另一个账户的信息。比特币中,支付完完全全是另一种方式。这里: 没有账户 没有余额 没有地址 没有币 没有发送者和接受者 因为区块链是一个公共...阅读全文

博文 2018-11-19 20:34:50 小马哥_Magical

不得不知道的golang之sync.Mutex互斥锁源码分析

针对Golang 1.9的sync.Mutex进行分析,与Golang 1.10基本一样除了将panic改为了throw之外其他的都一样。源代码位置:sync\mutex.go。可以看到注释如下: Mutex can be in 2 modes of operations: normal and starvation. In normal mode waiters are queued in FIFO order, but a woken up waiter does not own the mutex and competes with new arriving goroutines over the ownership. New arriving goroutines have an a...阅读全文

博文 2018-07-02 20:45:27 梦朝思夕

EasyJson输出Slice类型JSON

EasyJson(https://github.com/mailru/easyjson)由于采用了静态代码生成技术,所以他的性能比GO语言中内置的利用反射机制实现Json解析性能高出很多(通常情况下处理时间仅为其七分之一)。 但是,EasyJson通常是针对结构体生成代码的,那么如果有个Slice如何实现JSON的Marshal和Unmarshal呢?如下: ​ ``` type BasicInfo struct { Name string `json:"name"` Age int `json:"age"` } type BasicInfoList []BasicInfo ​``` 如果你使用easyjson -all来生成JSON Marshal和Unmarshal的代码 BasicIn...阅读全文

博文 2019-07-12 23:08:51 chaocai2001

gf框架之gmlock - 内存锁模块

文章来源:http://gf.johng.cn/os/gmlock/... 内存锁。该模块包含两个对象特性: Locker 内存锁,支持按照给定键名生成内存锁,并支持Try*Lock及锁过期特性; Mutex 对标准库底层sync.Mutex的封装,增加了Try*Lock特性; 使用方式: import "gitee.com/johng/gf/g/os/gmlock" 使用场景: 任何需要并发安全的场景,可以替代sync.Mutex; 需要使用Try*Lock的场景(不需要阻塞等待锁释放); 需要动态创建互斥锁,或者需要维护大量动态锁的场景; 方法列表 func Lock(key string, expire ...int) func RLock(key string, expire ......阅读全文

博文 2018-10-18 17:34:43 John

mutex.go

概述 mutex.go是golang中针对互斥锁的实现,内部仅提供两个方法,分别是Lock()和Unlock,同时定义了几个常量和一个Mutex结构,如下 type Mutex struct { state int32 // 互斥锁上锁状态枚举值如下所示 sema uint32 // 信号量,向处于Gwaitting的G发送信号 } const ( mutexLocked = 1 << iota // 1 互斥锁是锁定的 mutexWoken // 2 唤醒锁 mutexWaiterShift = iota // 2 统计阻塞在这个互斥锁上的goroutine数目需要移位的数值 ) 如果对Mutex进行复制,可能会导致锁失效,因为内部都是值复制,相当于复制了一把新锁,mutexLocked标...阅读全文

博文 2019-03-29 20:34:40 killtl

Go 标准库 —— sync.Mutex 互斥锁

Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。 方法 func (*Mutex) Lock func (m *Mutex) Lock() Lock 方法锁住 m,如果 m 已经加锁,则阻塞直到 m 解锁。 func (*Mutex) Unlock func (m *Mutex) Unlock() Unlock 方法解锁 m,如果 m 未加锁会导致运行时错误。 注意 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁 在 Lock() 之前使...阅读全文

博文 2018-06-05 11:34:38 舆图易稿

环境搭建

https://golang.google.cn/dl/ 1、下载二进制包:go1.4.linux-amd64.tar.gz。 wget https://dl.google.com/go/go1.12.8.linux-amd64.tar.gz 2、将下载的二进制包解压至 /usr/local目录。 tar -C /usr/local -xzf go1.12.8.linux-amd64.tar.gz 3、将 /usr/local/go/bin 目录添加至PATH环境变量:export PATH=$PATH:/usr/local/go/bi...阅读全文

博文 2019-08-16 00:32:52 麦子时光_新浪微博

go channel实现浅析

![qrcode_for_gh_5fcf50a6cc50_344.jpg](https://static.studygolang.com/180302/5316ebc60d4994ed92450c8b5da025f9.jpg) 实现: go1.10/src/runtime/chan.go CSP模型的实现 带缓冲的channel: c.qcount>0 表示c.recvq是empty的,可以接收数据。 c.qcount < c.dataqsiz意味着c.sendq是empty的,可以发送数据。 hchan结构体使用一个环形队列来保存groutine之间传递的数据(如果是缓存channel的话),使用两个list保存向...阅读全文