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;
}

互斥量总结

  1. 互斥量函数都有返回,成功返回0,可根据需要进行判断记录错误信息;
秋风 2016-12-25