/*
名称:多线程通信中同步–互斥锁
说明:多线程由于共享一部分数据段,所以当不同的线程对这部分数据进行访问的时候,就需要进行同步。以防出现数据的不一致。就我现在了解,线程中的同步有两种方式,一是这里的互斥锁,二是信号量。互斥锁,通俗说,就是只有当线程拿到这把锁之后才能进行一系列操作(包括对互斥变量的操作)。在这期间其他进程由于没有锁,只能陷入阻塞等待状态。当完成操作后,线程需要释放锁,否则可能会陷入死锁状态。
在本例中,如果去掉锁,则最终答案为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;
}