互斥锁示例pthread_mutex_t

在多线程应用中,所有的线程都是共享资源,线程时并发运行的,此时,就有可能发导致多个线程同时访问操作共享资源。假如有AB两个线程,A线程读共享资源,B线程写共享资源,就会发生A线程读取的共享资源一部分被B线程修改过一部分没有修改,那么在这种情况下就是一个数据的混乱,通常数据要么是原始数据,要么是经过完成修改后的数据,而多线程的并发行就可能产生访问的资源还没有被全部修改完毕,就被读取了。


经典案例:有两个编号为1,2的线程,共同售票100张,票号从1到100,

输出每个线程所售票的票号。


#include<stdio.h>

#include<pthread.h>

#include<assert.h>

#include<unistd.h>

#include<stdlib.h>


pthread_mutex_tmutex;//定义互斥锁

int tickets=1;


void*saleTicket(void*argv)

{

        int id=(int)argv;

        while(1)

       {

                //pthread_mutex_lock(&mutex);//上锁

                if(tickets<=100)

                {

                      usleep(5);

                      printf("第%d窗口售票:%d号\n",id,tickets++);

                 // pthread_mutex_unlock(&mutex);//解锁

                 }

                 else

                 {

                         //pthread_mutex_unlock(&mutex);//解锁

                         break;

                  }

        }

        pthread_exit(NULL);

}


int main()

{

     pthread_t pth1,pth2;

     int ret;


     //初始化互斥锁

     pthread_mutex_init(&mutex,NULL);


     ret=pthread_create(&pth1,NULL,saleTicket,(void*)1);

     assert(ret==0);

     ret=pthread_create(&pth2,NULL,saleTicket,(void*)2);

     assert(ret==0);


     pthread_join(pth1,NULL);

     pthread_join(pth2,NULL);

     pthread_mutex_destroy(&mutex);//销毁互斥锁

     return 0;

}

如果将代码中的互斥锁的上锁和解锁去掉(usleep是为了增加出错的几率),就会可能出现票号101的情形,这种错误是及其致命的,不允许发生。此时使用互斥锁就会解决这种问题所带来的错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值