多线程例子

互斥锁

      正如上面所说的,如果两个线程同时对一块内存进行读写或者对向同一个文件写数据,那么结果是难以设想的。正因为如此,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

 例如int *a  int *b  分别指向两块内存,上面的值分别初始化为(200, 100) 线程A执行这样的一个操作:将*a的值减少50,*b的值增加50.

 线程B执行:打印出(a 跟 b 指向的内存的值的和)。

      如果串行运行:A: *a -= 50; *b += 50;  B: printf("%d\n", *a + *b);  

      如果并发执行,则有可能会出现一下调度:*a -= 50; printf("%d\n", *a + *b); *b += 50;

      因此我们可以引入互斥量,在对共享数据读写时进行锁操作,实现对内存的访问以互斥的形式进行。

      

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
 
int  a = 200;
int  b = 100;
pthread_mutex_t lock;
 
void * ThreadA( void * arg)
{
pthread_mutex_lock(&lock);          //锁
a -= 50;
sleep(5);                                      //执行到一半 使用sleep 放弃cpu调度
b += 50;
pthread_mutex_unlock(&lock);
}
 
void * ThreadB( void * arg)
{
sleep(1);                            //放弃CPU调度 目的先让A线程运行。
pthread_mutex_lock(&lock);
printf ( "%d\n" , a + b);
pthread_mutex_unlock(&lock);
}
 
int  main()
{
pthread_t tida, tidb;
pthread_mutex_init(&lock, NULL);
pthread_create(&tida, NULL, ThreadA, NULL);
pthread_create(&tidb, NULL, ThreadB, NULL);
pthread_join(tida, NULL);
pthread_join(tidb, NULL);
return  1;
}

    以上输出为300  去掉锁操作  输出为250。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值