Linux 多线程编程( POSIX )( 五 )----->代码区 ( 条件变量实例 )

原创 2012年03月21日 06:45:38
1.条件变量的基本作用

//!> 条件变量的基本作用

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

//!> 注意此处为了方便就使用静态变量吧

pthread_mutex_t 
      mutex =PTHREAD_MUTEX_INITIALIZER;
                  //!> 初始化互斥锁
pthread_cond_t       cond =PTHREAD_COND_INITIALIZER;
                  //!> 初始化条件变量

int                   g_i =0;

//!> 线程1入口
void * entrance_1( void * arg )
{
    for( g_i =1; g_i < 10; g_i++ )
    {
      pthread_mutex_lock( &mutex);      //!> 上锁
      
       if( g_i % 3== 0 )                  //!> 给一个唤醒条件
       {
         pthread_cond_signal( &cond);   //!> 执行唤醒
       }
       else
       {
         printf("线程1在执行:%d\n", g_i);
       }
      
      pthread_mutex_unlock( &mutex);   //!> 解锁
      
       sleep( 1);
    }
}

//!> 线程2入口
void* entrance_2( void * arg )
{
    while( g_i< 10 )
    {
      pthread_mutex_lock( &mutex);      //!> 加锁
      
       if( g_i % 3!= 0 )
       {
         pthread_cond_wait( &cond, &mutex);   //!> 等待
       }
      
      printf("线程2在执行:%d\n", g_i);
      
      pthread_mutex_unlock( &mutex);   //!> 解锁
      
       sleep( 1);
    }
}

int main( )
{
   pthread_t      tid1;   //!> 线程1
   pthread_t      tid2;   //!> 线程2
   
    if(pthread_create( &tid1, NULL, entrance_1, NULL ) !=0 )
    {
      printf("创建线程1失败....\n");
       exit(EXIT_FAILURE );
    }
    
    if(pthread_create( &tid2, NULL, entrance_2, NULL ) !=0 )
    {
       printf("创建线程2失败....\n");
       exit(EXIT_FAILURE );
    }

   pthread_join( tid1, NULL);   //!> 等待...
   pthread_join( tid2, NULL);   //!> 等待...
   
   pthread_mutex_destroy( &mutex);      //!> 销毁
   pthread_cond_destroy( &cond);      //!> 销毁
   
    return0;
}


    结果:
   线程1在执行:1
   线程1在执行:2
   线程2在执行:3         //!> ------> 222
   线程1在执行:4
   线程1在执行:5
   线程2在执行:6         //!>------>222   
   线程1在执行:7
   线程1在执行:8
   线程2在执行:9         //!> ------>222


2.生产消费者

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define  MAX    5

pthread_mutex_t       mutex =PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t       cond =PTHREAD_COND_INITIALIZER;

typedef struct
{
   char   buf[MAX];
    int       count;
}BUFFER;

BUFFER share = { "", 0};   //!> 初始化
char ch = 'A';

void * _read_( void * arg )
{
    int n =0;
   
   printf("读:%d  开始....\n",(unsigned)pthread_self());
   
    while( ch !='Z' )
    {
      pthread_mutex_lock( &mutex);      //!> 加锁
      
       if(share.count != MAX)      //!> 不是最大就读,就是一次性读入
       {
         share.buf[share.count++] =ch++;   //!> 读入
          printf("读%d:当前字符 = %c\n", (unsigned)pthread_self(), ch-1);
         
          if(share.count == MAX )//!> 达到MAX,不读入
          {
             printf("读%d:缓冲区满!\n", (unsigned)pthread_self());
            pthread_cond_signal( &cond);   //!> ??????
           
       }
      
      pthread_mutex_unlock(&mutex);   //!> 解锁互斥量
    }
   
    sleep( 1);
    printf("读%d:退出咯~\n", (unsigned)pthread_self());

}

void * _write_( void * arg )
{
    int i, n =0;
   
   printf("写:%d  开始....\n",(unsigned)pthread_self());

    while( ch !='Z' )
    {
      pthread_mutex_lock( &mutex );
      
       printf("写%d:等待...\n", (unsigned)pthread_self());
       while(share.count != MAX )
       {
         pthread_cond_wait( &cond, &mutex);   //!> 只要buf不满等待...
       }
      
       printf("写%d:开始写入...\n", (unsigned)pthread_self());
       for( i = 0;share.count > 0 ; i++, share.count-- )
       {
         printf("%c  ",share.buf[i]);   //!> 输出看看...
          if(share.count == 1 )
          {
            printf("\n");      //!> 换行格式而已
          }
       }
      
      pthread_mutex_unlock( &mutex );
    }

    sleep( 1);   
    printf("写%d:退出...\n", (unsigned)pthread_self());
}

int main()
{
   pthread_t       tid_read,tid_write;
   
    if (pthread_create( &tid_read, NULL, _read_, NULL ) !=0 )
    {
      printf("创建线程1失败...\n");
       exit(EXIT_FAILURE );
    }

    if (pthread_create( &tid_write, NULL, _write_, NULL )!= 0 )
    {
      printf("创建线程2失败...\n");
       exit(EXIT_FAILURE );
    }
   
   pthread_join( tid_read, NULL );
   pthread_join( tid_write, NULL );
   
   pthread_mutex_destroy( &mutex );
   pthread_cond_destroy( &cond );
   
    return0;
}
   
/*
   读:1680848640  开始....
    读1680848640:当前字符 = A
    读1680848640:当前字符 = B
    读1680848640:当前字符 = C
    读1680848640:当前字符 = D
    读1680848640:当前字符 = E
    读1680848640:缓冲区满!
   写:1672455936  开始....
    写1672455936:等待...
    写1672455936:开始写入...
      
    写1672455936:等待...
    读1680848640:当前字符 = F
    读1680848640:当前字符 = G
    读1680848640:当前字符 = H
    读1680848640:当前字符 = I
    读1680848640:当前字符 = J
    读1680848640:缓冲区满!
    写1672455936:开始写入...
   
    写1672455936:等待...
    读1680848640:当前字符 = K
    读1680848640:当前字符 = L
    读1680848640:当前字符 = M
    读1680848640:当前字符 = N
    读1680848640:当前字符 = O
    读1680848640:缓冲区满!
    写1672455936:开始写入...
   
    写1672455936:等待...
    读1680848640:当前字符 = P
    读1680848640:当前字符 = Q
    读1680848640:当前字符 = R
    读1680848640:当前字符 = S
    读1680848640:当前字符 = T
    读1680848640:缓冲区满!
    写1672455936:开始写入...
   
    写1672455936:等待...
    读1680848640:当前字符 = U
    读1680848640:当前字符 = V
    读1680848640:当前字符 = W
    读1680848640:当前字符 = X
    读1680848640:当前字符 = Y
    读1680848640:缓冲区满!
    写1672455936:开始写入...
   
    写1672455936:退出...
    读1680848640:退出咯~

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Linux 多线程编程( POSIX )( 五 )----->条件变量

Attebtion:打开相关代码链接 1.   条件变量:     条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到    某特殊情况发生为止。通常条件变量和...

Posix多线程编程(5)—条件变量

一、什么是条件变量  与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。  条件变量使我们可以睡眠等待某种条件出...
  • ruglcc
  • ruglcc
  • 2012年08月17日 10:18
  • 593

Posix多线程编程(1) 互斥锁与条件变量

多线程 互斥锁 以及 条件变量的工作流程

POSIX多线程编程-条件变量pthread_cond_t

有的时候仅仅依靠锁住共享资源来使用它是不够的。有时候共享资源只有某些状态的时候才能够使用。比方说,某个线程如果要从堆栈中读取数据,那么如果栈中没有数据就必须等待数据被压栈。这种情况下的同步使用互斥锁 ...

POSIX多线程编程-条件变量pthread_cond_t

条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它...

linux多线程编程--信号量和条件变量 唤醒丢失事件

关于linux下信号量和条件变量的使用,在很多地方都可以找到相关文章,信号量、条件变量、互斥锁都是线程同步原语,在平时多线程编程中只要知道一两种就可以轻松搞定,我也是这么认为的,但是今天发现,有时还是...

Linux操作系统下的多线程编程详细解析----条件变量

Linux操作系统下的多线程编程详细解析----条件变量   1.初始化条件变量pthread_cond_init #include int pthread_cond_init(pthrea...

Linux多线程编程(三)-----生产者与消费者(条件变量,信号量)

Linux多线程编程(一):http://blog.csdn.net/llzk_/article/details/55670172 Linux多线程编程(二):http://blog.csdn.ne...
  • LLZK_
  • LLZK_
  • 2017年02月22日 21:02
  • 1317

Linux多线程编程详细解析----条件变量 pthread_cond_t

Linux操作系统下的多线程编程详细解析----条件变量   1.初始化条件变量pthread_cond_init #include int pthread_cond_ini...
  • hoi0714
  • hoi0714
  • 2012年01月31日 08:51
  • 245

linux 多线程编程 互斥锁与条件变量

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待 “ 条件变量的条件成立” 而挂起,另一个线程使 “条件成立 ”(给出条件成立信号),为了防止竞争,条件变量的使用总...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 多线程编程( POSIX )( 五 )----->代码区 ( 条件变量实例 )
举报原因:
原因补充:

(最多只允许输入30个字)