使用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

猜你喜欢

转载自blog.csdn.net/qq_15437667/article/details/70769084