关闭

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

标签: 多线程linux编程nulljoin测试
1071人阅读 评论(0) 收藏 举报
分类:
加锁与不加锁的对比:


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


#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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:554794次
    • 积分:6456
    • 等级:
    • 排名:第3718名
    • 原创:182篇
    • 转载:36篇
    • 译文:0篇
    • 评论:82条
    博客专栏