简单多线程同步--互斥锁

/*
名称:多线程通信中同步–互斥锁
说明:多线程由于共享一部分数据段,所以当不同的线程对这部分数据进行访问的时候,就需要进行同步。以防出现数据的不一致。就我现在了解,线程中的同步有两种方式,一是这里的互斥锁,二是信号量。互斥锁,通俗说,就是只有当线程拿到这把锁之后才能进行一系列操作(包括对互斥变量的操作)。在这期间其他进程由于没有锁,只能陷入阻塞等待状态。当完成操作后,线程需要释放锁,否则可能会陷入死锁状态。
在本例中,如果去掉锁,则最终答案为250,即出现了数据的不一致。加上锁后,答案为300,具有数据的一致性。互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。
在此简单介绍一点:
(1).锁可以用pthread_mutex_init函数动态的创建,函数原型如下:
int pthread_mutex_init(pthread_mutex_t mutex, const pthread_mutexattr_t attr)
(2).对锁的操作主要有加锁和解锁
 int pthread_mutex_lock(pthread_mutex_t *mutex)
  int pthread_mutex_unlock(pthread_mutex_t *mutex)

*/

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

//全局变量
int a = 200;        
int b = 100;
pthread_mutex_t lock;       //声明互斥锁

void ThreadA()
{

    pthread_mutex_lock(&lock);      //加锁
    a = a-50;
    sleep(5);               //从此处开始运行B线程
    b = b+50;
    pthread_mutex_unlock(&lock);    //解锁
}

void ThreadB()
{

    sleep(1);               //等待A线程先运行

    pthread_mutex_lock(&lock);      //加锁

    printf("a+b=%d\n",a+b);

    pthread_mutex_unlock(&lock);    //解锁
}


int main(void)
{
    pthread_t id_a,id_b;

    pthread_mutex_init(&lock,NULL);     //初始化互斥锁
    pthread_create(&id_a,NULL,(void*)ThreadA,NULL);     //创造线程A
    pthread_create(&id_b,NULL,(void*)ThreadB,NULL);     //创造线程B

    pthread_join(id_a,NULL);            //等待线程A
    pthread_join(id_b,NULL);            //等待线程B

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值