手机版
你好,游客 登录 注册
背景:
阅读新闻

Linux 多线程编程( POSIX )

( 四)代码区

[日期:2012-03-22] 来源:Linux社区  作者:shanshanpt [字体: ]
加锁与不加锁的对比:


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


#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
linux
相关资讯       Linux编程 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款