分享
  1. 首页
  2. 文章

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

yujian0231 · · 7309 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

看到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

查看原文:c,golang 条件变量的使用对比

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
7309 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏