关闭

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

标签: 多线程linux编程nulljoin测试
1158人阅读 评论(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网站的观点或立场

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

Posix信号量Posix 信号量有名信号量无名信号量sem_opensem_initsem_closesem_destroysem_unlink sem_waitsem_post 有名信号量#include /* For O_* constant...
  • hanqing280441589
  • hanqing280441589
  • 2015-02-19 17:24
  • 2676

Visual C++线程同步技术剖析:临界区,事件,信号量,互斥量

转自: 使线程同步   在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进行。   如果不采取适当的措施,其他线程往往会在线程处理任务结束前...
  • L_Andy
  • L_Andy
  • 2015-01-28 11:14
  • 899

C++11多线程编程之互斥量

C++11多线程编程之互斥量
  • u012333003
  • u012333003
  • 2014-05-07 15:55
  • 1124

关键段和互斥量的区别

关键段是用户态下面的同步方法,而互斥量是内核态的同步方法
  • lizhihaoweiwei
  • lizhihaoweiwei
  • 2014-09-10 21:10
  • 716

Linux常见锁比较--自旋锁、互斥锁、信号量、临界区

自旋锁(SpinLock):锁的目的是为了保护共享资源,实现线程同步。自旋锁区别于其他锁的地方在于若某线程在未获得锁时将不断的询问(判断)自旋锁保持者是否释放了锁(获取锁操作将自旋在那里,不断地申请获取,直到自旋锁保持者释放了锁),因此比较适用于保持锁时间比较短的情况(CPU一直在空转)。需要注意的...
  • liu_sheng_1991
  • liu_sheng_1991
  • 2016-08-23 15:36
  • 1788

linux多线程下互斥量与信号量的区别

互斥量(Mutex)   互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。   Mutex本质上说就是一把锁,提供对资源...
  • ycc541
  • ycc541
  • 2015-05-08 16:23
  • 1843

C++多线程-第二篇-Mutex(互斥量)

//Boost #include #define BOOST_THREAD_VERSION 4 //使用最新版本,含有1,2,3但只是为了兼容之前程序。 Thread库丰富强大的扩展功能但不在Thread中的未看。 //C++11 #include using namspace...
  • hffhjh111
  • hffhjh111
  • 2016-11-12 16:10
  • 6075

linux Posix线程同步(条件变量) 实例

条件变量实例    条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法。举个简单的例子,应用程序A中包含两个线程t1和t2。t1需要在bool变量test_cond为true时才能继续执行,而test_co...
  • macdroid
  • macdroid
  • 2015-05-14 17:25
  • 1698

Windows支持的4种类型的同步对象:临界区、互斥量、事件和信号量

Windows支持4种类型的同步对象,可以用来同步由并发运行的线程所执行的操作: 临界区互斥量事件信号量     MFC在名为CCriticalSection、CMutex、CEvent和CSemaphore的类中封装了这些对象。下面分别对这些同步对象进行介绍。 临...
  • skywalker_leo
  • skywalker_leo
  • 2015-09-01 15:03
  • 1375

临界区和互斥量的区别

1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 临界区(Critical Section)   保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个...
  • yangshuangtao
  • yangshuangtao
  • 2016-07-23 15:04
  • 858
    个人资料
    • 访问:618724次
    • 积分:7007
    • 等级:
    • 排名:第3817名
    • 原创:182篇
    • 转载:36篇
    • 译文:0篇
    • 评论:84条
    博客专栏