linux学习笔记20-线程同步之互斥量
互斥量
互斥量可以确保同一时间只有一个线程访问数据,本质上是一个锁,在访问共享资源之前加锁,在完成之后将锁释放.示例1 多个线程访问共享sum变量,sum能得预期的值吗?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int sum = 0;
void *func(void *arg)
{
int i;
for(i=0;i<1000000;i++)
{
sum += 1;
}
return NULL;
}
int main(int argc,char *argv[])
{
pthread_t t1,t2;
pthread_create(&t1,NULL,func,NULL);
pthread_create(&t2,NULL,func,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
printf("sum=%d\n",sum);
return 0;
}
结论:多核多线程的cpu中,sum的结果不一定是我们的预期值.在单核多线程中,结果和我们预期值一样.
示例2 使用互斥量(静态分配)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//方式一,利用PTHREAD_MUTEX_INITIALZER常量值初始化
//具体可以查看pthread.h头文件
//# define PTHREAD_MUTEX_INITIALIZER \
// { { 0, 0, 0, 0, 0, 0, { 0, 0 } }
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int sum = 0; //两个线程分别1000000 正确结果应该是:2000000
void *func(void *arg)
{
int i;
pthread_mutex_lock(&mutex); //加锁,同一时间只有一个线程可以访问
for(i=0;i<1000000;i++)
{
sum += 1;
}
pthread_mutex_unlock(&mutex); //释放锁,加锁和释放是成对出现的.
return NULL;
}
int main(int argc,char *argv[])
{
pthread_t t1,t2;
//方式二,用pthread_mutex_init函数对pthread_mutext_t初始化
//pthread_mutex_init(&mutex,NULL);
pthread_create(&t1,NULL,func,NULL);
pthread_create(&t2,NULL,func,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_mutex_destroy(&mutex); //销毁互斥量
printf("sum=%d\n",sum);
return 0;
}
示例3 使用互斥量(动态分配)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int sum = 0;
void *func(void *arg)
{
int i;
pthread_mutex_t *mutex =(pthread_mutex_t *)arg;
pthread_mutex_lock(mutex); //进行加锁
for(i=0;i<1000000;i++)
{
sum += 1;
}
pthread_mutex_unlock(mutex); //释放
return NULL;
}
int main(int argc,char *argv[])
{
pthread_t t1,t2;
pthread_mutex_t *mutex;
mutex = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
int mutex_result = pthread_mutex_init(mutex,NULL); //动态分配用用pthread_mutex_init初始化
//printf("mutex_result=%d\n",mutex_result); //打印初始化结果
pthread_create(&t1,NULL,func,(void *)mutex);
pthread_create(&t2,NULL,func,(void *)mutex);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_mutex_destroy(mutex);
if(mutex != NULL)
{
free(mutex); //先销毁mutex,在释放动态分配的内存
}
printf("sum=%d\n",sum);
return 0;
}
互斥量总结
- 互斥量函数都有返回,成功返回0,可根据需要进行判断记录错误信息;
秋风
2016-12-25