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

原创 2012年03月21日 06:42:51
加锁与不加锁的对比:


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


#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


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

相关文章推荐

Posix多线程编程学习笔记(四)—互斥量(2)

四、互斥锁属性        线程和线程的同步对象(互斥量,读写锁,条件变量)都具有属性。在修改属性前都需要对该结构进行初始化。使用后要把该结构回收。我们用pthread_ mutexattr_in...
  • elbort
  • elbort
  • 2012年05月22日 10:56
  • 230

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

1.条件变量的基本作用 //!> 条件变量的基本作用 #include #include #include //!> 注意此处为了方便就使用静态变量吧 pthread...

Linux 多线程编程( POSIX )( 三 )------->代码区 ( 信号灯实例 )

1.sem_open与sem_close与sem_unlink与sem_getvalue #include #include #include #include #include...

Linux 多线程编程( POSIX )( 六 )----->代码区 ( 共享内存实例 )

注意:以下编译加上  -lrt 例如:gcc  -o server  server.c  -lrt 1.创建一个共享内存区的例子 #include #include #inclu...

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资...

C++多线程编程同步技术剖析:临界区,时间,信号量,互斥量

摘要: 多线程同步技术是计算机软件开发的重要技术,本文对多线程的各种同步技术的原理和实现进行了初步探讨。关键词: VC++6.0; 线程同步;临界区;事件;互斥;信号量; 正文 使线程同步   在程序...

Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_c...

Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

Posix信号量Posix 信号量有名信号量无名信号量sem_opensem_initsem_closesem_destroysem_unlink sem_waitsem_post 有名信号量#inc...

Linux 多线程编程( POSIX )( 六 )----->共享内存区

Attention:打开相关代码区 1. 介绍      POSIX 共享内存和SYSTEMV的共享内存的框架是差不多的,细节有区别!     在前面的SYSTEM V的共享内存...

【C/C++多线程编程之六】pthread互斥量

多线程编程之线程同步互斥量       Pthread是 POSIX threads 的简称,是POSIX的线程标准。           Pthread线程同步指多个线程协调地,有序地同步使...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 多线程编程( POSIX )( 四 )------>代码区 ( 互斥量实例 )
举报原因:
原因补充:

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