【Linux】线程互斥

线程最大的特性就是可以一个代码,多个线程同时执行,从而极大地提升程序的运行速度。然而,在线程并发的同时要注意,互斥的情况,比如如下的一个模拟一个最近话题的抢票程序,显然设定的三个线程仅能有一个线程得到票,否则票会撕烂,其实,这个程序在《【Java】利用synchronized(this)完成线程的临界区》(点击打开链接)已经详细说过了,只是这次的编程环境编程了LinuxC。

如下的线程互斥的程序,可以看到这个mutex程序的运行结果由于操作系统对线程的资源分配的不同而不同。

【Linux】线程互斥_第1张图片

具体代码如下:

#include 
#include 
#include 
pthread_mutex_t mutex;//声明一个互斥锁mutex
int ticket=10;
void *thread_function(void *arg){
	while(ticket>0){
		if(pthread_mutex_lock(&mutex)!=0){//对互斥锁上锁,临界区开始
			printf("%s的互斥锁创建失败!\n",(char *)arg);
			pthread_exit(NULL);
		}
		if(ticket>0){//如果还有票
			ticket--;
			printf("%s拿到了票,现在票量剩余:%d\n",(char *)arg,ticket);
			sleep(1);//该线程挂起1秒
		}
		else{//否则退出
			pthread_exit(NULL);//退出线程
		}
		pthread_mutex_unlock(&mutex);//解锁,临界区结束
		sleep(1);//该线程挂起1秒
	}
	pthread_exit(NULL);//退出线程
}
int main(){
	pthread_mutex_init(&mutex,NULL);//初始化这个互斥锁
	//声明并创建三个线程
	pthread_t t1;
	pthread_t t2;
	pthread_t t3;
	if(pthread_create(&t1,NULL,thread_function,"线程1")!=0){
		printf("创建线程失败!程序结束!\n");
		exit(1);
	}
	if(pthread_create(&t2,NULL,thread_function,"线程2")!=0){
		printf("创建线程失败!程序结束!\n");
		exit(1);
	}
	if(pthread_create(&t3,NULL,thread_function,"线程3")!=0){
		printf("创建线程失败!程序结束!\n");
		exit(1);
	}
	pthread_join(t1,NULL);
	pthread_join(t2,NULL);
	pthread_join(t3,NULL);
	//三个线程都完成才能执行以下的代码
	pthread_mutex_destroy(&mutex);//销毁这个互斥锁
	return 0;
}

LinuxC线程的使用,在《【Linux】线程》( 点击打开链接)已经讲过了,这里主要讲互斥。线程互斥锁,应该作为全局变量声明,因为线程互斥锁会在主函数声明,线程执行函数内使用,之后,在主函数新建的三个线程,共同执行void *thread_function(void *arg);中的代码。

三个线程形成的互斥关系如下所示:

【Linux】线程互斥_第2张图片

其实这与java本身就有的关键字synchronized是一模一样的,唯一不同是,LinuxC中的互斥锁还要自己声明,初始化,销毁而已。

你可能感兴趣的:(Linux,Linux,线程,互斥,并发,临界区)