演绎linux多线程.第二篇

前言

在上一篇文章中,代码没有达到预期的结果,在文章的最后给出了问题所在,并给出了临界区的概念,精确的定义可以百度一下。

既然问题是对临界区的同时访问,那么只要保证同一个时刻只有一个线程对其访问应该就能解决问题。

函数介绍

互斥锁

pthread_mutex_t mutex;

线程只有得到它的所有权之后,才能对它后面的代码进行操作。

初始化函数

int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

互斥锁的初始化

第一个参数是互斥锁,第二参数是互斥锁的属性


互斥锁锁定函数

int pthread_mutex_lock(pthread_mutex_t *mutex);

互斥锁解锁函数

int pthread_mutex_unlock(pthread_mutex_t *mutex);

代码

#include<pthread.h>
#include<stdio.h>
#include<cstdlib>
#include<unistd.h>
pthread_mutex_t mutex;
int threadNum=0;//线程获取的号码
void *threadFuntion(void *arg){
	int num=*(int *)arg;//线程编号
	sleep(1);
	pthread_mutex_lock(&mutex);
	printf("第%d个线程获取的号码:%d\n",num,threadNum);//将号码输出
	threadNum++;
	pthread_mutex_unlock(&mutex);
}
int main(){
	int i,j;
	printf("演绎linux多线程.第一篇 \n");
	printf("by 第XXX个小号 原文(http://blog.csdn.net/ccy0815ccy)  \n");
	const int N=10;
	//pthread_mutexattr_t mattr;
	pthread_mutex_init(&mutex,NULL);
	pthread_t threadID[N];//线程ID
	for(i=0;i<N;i++){
		pthread_create(&threadID[i],NULL,threadFuntion,&i);//将号码传给线程
	}
	for(j=0;j<N;j++)
		pthread_join(threadID[j],NULL);//等待线程运行结束
	printf("运行完成后threadNum的值:%d\n",threadNum);
	return 0;
}

运行结果

演绎linux多线程.第二篇_第1张图片


当有线程锁定互斥锁后(锁定相当于获得该锁的使用权),其他线程将无法对其再次锁定,被阴塞,直到抢到该锁(可能多个线程等待该锁)。

从运行结果可以看出来。号码的分配已经正常,说明线程互斥问题基本解决。

但我在分配号码的基础上增加了线程的启动顺序编号,得到哪个线程获取哪一个号码。结果显然是有问题的。这个是线程的同步(似乎是互斥有点像,但不一样),下一扁再说了

你可能感兴趣的:(演绎linux多线程.第二篇)