文档章节

c,golang 条件变量的使用对比

yujian0231
 yujian0231
发布于 2015/01/15 13:24
字数 342
阅读 100
收藏 0

看到golang 标准库 sync  package 提供了传统的mutex, once, cond, rwmutex 等基于共享内存的同步原语,就想写个代码实验一下。

type Cond struct {    
      // L is held while observing or changing the condition
    L Locker
      // contains filtered or unexported fields
}

Cond 结构包含一个可导出的Locker 对象

func NewCond(l Locker) *Cond

NewCond 函数 接受一个实现Locker 接口的对象, 返回一个指向Cond 的指针;   pthread_cond_t  对应于此

func (c *Cond) Broadcast()

Brocast 唤醒所有在这个cond 对象上等待的 goroutine; pthread_cond_brocast() 对应于此

func (c *Cond) Signal()

Signal 唤醒一个再此cond 对象上等待的goroutine;  pthread_cond_signal() 对应于此

type Mutex struct {    // contains filtered or unexported fields  }

func (m *Mutex) Lock()

func (m *Mutex) Unlock()

Mutex 拥有Lock,Unlock 方法, 所以实现了 

type Locker interface {
    Lock()
    Unlock()
}

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int condition = 0;
int count = 0;

int consume( void )
{
   while( 1 )
   {
      pthread_mutex_lock( &mutex );
      while( condition == 0 )
         pthread_cond_wait( &cond, &mutex );
      printf( "Consumed %d\n", count );
      condition = 0;
      pthread_cond_signal( &cond );      
      pthread_mutex_unlock( &mutex );
   }

   return( 0 );
}

void*  produce( void * arg )
{
   while( 1 )
   {
      pthread_mutex_lock( &mutex );
      while( condition == 1 )
         pthread_cond_wait( &cond, &mutex );
      printf( "Produced %d\n", count++ );
      condition = 1;
      pthread_cond_signal( &cond );      
      pthread_mutex_unlock( &mutex );
   }
   return( 0 );
}

int main( void )
{
   pthread_t thr;
   pthread_create( &thr, NULL, &produce, NULL );
   return consume();
}

接着等价的golang 实现:

package main 

import (
    "fmt"
    "sync"
)

var count = 0
var condition = 0

func main(){
    lock := new(sync.Mutex)
    cond := sync.NewCond(lock)

    go func (){
        for {
           lock.Lock() 
           for condition == 0 {
               cond.Wait()
           }
           fmt.Printf("Consumed %d\n", count )
           condition = 0
           cond.Signal()
           lock.Unlock()
        }
    }()
    for {
           lock.Lock() 
           for condition == 1 {
               cond.Wait()
           }
           fmt.Printf("Produced %d\n", count )
           count++
           condition = 1
           cond.Signal()
           lock.Unlock()
    }
}


© 著作权归作者所有

共有 人打赏支持
yujian0231
粉丝 5
博文 22
码字总数 27313
作品 0
昌平
私信 提问
为什么 PHPer 应当学习 Golang

熟悉我的朋友应当知道,近些年的大部分时间我的工作都会多少和 PHP 相关。随着 PHP 有着越来越深入的了解,以及遇到越来越多的不同业务时,使用 PHP 总会让我有一种莫名的无力感。当然,并不...

龙鸟
2012/11/28
0
4
《Golang 入门系列七》golang的运算符

前言:运算符优先级,是描述在计算机运算计算表达式时执行运算的先后顺序。 先执行具有较高优先级的运算,然后执行较低优先级的运算。 一、算数运算符 下表列出了所有Go语言的算术运算符。假...

IT--小哥
2018/02/28
0
0
Go 条件编译

GOPATH 环境变量, 我这里设置为 "d:golang" 目录 代码目录结构 d:golangsrctagerTestmain.go d:golangsrctagerTesttestp1.go d:golangsrctagerTesttestp2.go 从上面我们看到 p1.go 和 p2.g......

老汉-憨憨
2018/02/06
0
0
golang: beego自动化部署

springboot: springboot+mongodb+docker实例 golang: beego自动化部署 数据库管理平台NetopGO简介 Go语言开发 Go语言圣经(中文版) Go语言(golang)开源项目大全 Go语言诞生5周年!10大Go语言...

d_watson
2016/05/20
233
0
golang VS php 性能对比

原文 http://www.isno.cn/2013/12/golang-vs-php/ 在工作的项目中,我的主要开发语言是php,因需求或者为弥补php的缺陷,需要为php做各种各样的扩展,比如php本身不支持线程,没有队列,进程也...

神仙
2013/12/19
28.2K
34

没有更多内容

加载失败,请刷新页面

加载更多

centos7 安装maven

进入指定目录 cd /usr/local/src/ 下载maven 包 # 打开这个地址选中自己需要的版本补齐后面的地址,再复制到SSH去执行wget http://mirrors.hust.edu.cn/apache/maven/maven-3/ 解压改名 ...

Elson
35分钟前
4
0
推荐一个开源数据库迁移神器SQLines

SQLines 是一个开源(Apache License 2.0)可伸缩,并发高性能数据传输和schema 转换工具,你可以用作数据库迁移以及ETL过程 支持的数据库: Oracle and Oracle Exadata Microsoft SQL Server...

Benz001
37分钟前
12
0
面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题

今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一、缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Re...

我最喜欢三大框架
38分钟前
3
0
composer 很慢怎么办?

关于 Composer 的详细安装使用,详见之前的文章:在 PHP 中安装、使用 Composer 包管理工具 Composer 在国内不管是更新还是安装等都有一个「慢」的问题,有的时候真的很煎熬。 因此我们一般会...

whoru
50分钟前
2
0
ffmpeg提取音频文件

问题 从特定的mp3音频文件中,提取一部分作为新的mp3文件 ffmpeg ffmpeg -i a.mp3 -ss 00:25:00 -to 00:28:20 -acodec copy b.mp3 -i输入的文件 -ss从指定时间点开始提取 -to到指定时间点结...

亚林瓜子
59分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部