使用go channel实现一个简单的信号量

Posted 绯浅yousa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用go channel实现一个简单的信号量相关的知识,希望对你有一定的参考价值。

使用go channel实现一个简单的信号量

测试环境:mac

什么是信号量

信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。

信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。

介绍信号量的话,那么肯定不能不介绍P-V操作原语

P-V操作原语

P操作原语:

  1. semaphore 减1
  2. 若semaphore 大于等于0,线程继续执行.
  3. 若semaphore < 0 ,线程进入阻塞队列.

V操作原语:

  1. semaphore加1
  2. 若semaphore 大于 0, 线程继续执行
  3. 若semaphore 小于等于0,唤醒阻塞队例的线程

go简单实现

这里主要是实现互斥以及P-V操作原语

简单代码

package main

import (
    "sync"
    "fmt"
)

func main() 
    wg := sync.WaitGroup
    wg.Add(3)

    sem := make(chan int, 1)

    for i := 0; i < 3; i++ 
        go func(id int) 
            defer wg.Done()

            sem <- 1

            for x := 0; x < 3; x++ 
                fmt.Println(id, x)
            

            <-sem
        (i)
    

    wg.Wait()

运行结果

feiqianyousadeMacBook-Pro:go yousa$ GOMAXPROCS=2 go run sem.go
2 0
2 1
2 2
0 0
0 1
0 2
1 0
1 1
1 2

参考资料

最全面的linux信号量解析

http://blog.csdn.net/qinxiongxu/article/details/7830537

以上是关于使用go channel实现一个简单的信号量的主要内容,如果未能解决你的问题,请参考以下文章

GO语言并发

GO语言并发

Go基础--goroutine和channel

go语言之行--golang核武器goroutine调度原理channel详解

Golang channel源码分析

GO (channel简单使用篇)