Linux 多线程编程( POSIX )( 四 )------>代码区 ( 互斥量实例 )

加锁与不加锁的对比:


//!>不加锁测试
//!>简单的售票小测试程序


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

int  
          g_ticket =10;      //!> 票数目

void * entrance_1( void * arg )
{
      while(g_ticket > 0 )
      {
            printf("线程1售出票: %d \n", g_ticket);
            --g_ticket;
            sleep( 1);
      }
}

void * entrance_2( void * arg )
{
      while(g_ticket > 0 )
      {
            printf("线程2售出票: %d \n", g_ticket);
            --g_ticket;
            sleep( 1);
      }
}

int main( int argc, char ** argv )
{
      pthread_t            tid1,tid2;
     
      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);                  //!> 等待...

      return0;
}

./test
结果:
      线程1售出票:10
      线程2售出票:10
      线程2售出票:8
      线程1售出票:8
      线程2售出票:6
      线程1售出票:5
      线程1售出票:4
      线程2售出票:4
      线程2售出票:2
      线程1售出票:2
     
      看看结果就知道售票是不对的!!!
     


//!>加锁测试
//!>简单的售票小测试程序


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

int                                     g_ticket =10;      //!> 票数目
pthread_mutex_t            g_mutex;

void * entrance_1( void * arg )
{
      while(g_ticket > 0 )
      {
            pthread_mutex_lock( &g_mutex);            //!> 加锁
           
            printf("线程1售出票: %d \n", g_ticket);
            --g_ticket;
           
            pthread_mutex_unlock( &g_mutex);      //!> 解锁
            sleep( 1);
      }
}

void * entrance_2( void * arg )
{
      while(g_ticket > 0 )
      {
            pthread_mutex_lock( &g_mutex);            //!> 加锁
           
            printf("线程2售出票: %d \n", g_ticket);
            --g_ticket;
           
            pthread_mutex_unlock( &g_mutex);      //!> 解锁
            sleep( 1);
      }
}

int main( int argc, char ** argv )
{
      pthread_t            tid1,tid2;

      pthread_mutex_init( &g_mutex, NULL);      //!> 初始化
     
      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( &g_mutex);      //!> 删除互斥灯

      return0;
}

./test
结果:
      线程1售出票:10
      线程2售出票: 9     
      线程1售出票:8
      线程2售出票:7
      线程1售出票:6
      线程2售出票:5
      线程1售出票:4
      线程2售出票:3
      线程1售出票:2
      线程2售出票:1


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值