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

運行結果



當有線程鎖定互斥鎖後(鎖定相當於獲得該鎖的使用權),其他線程將無法對其再次鎖定,被陰塞,直到搶到該鎖(可能多個線程等待該鎖)。

從運行結果可以看出來。號碼的分配已經正常,說明線程互斥問題基本解決。

但我在分配號碼的基礎上增加了線程的啓動順序編號,得到哪個線程獲取哪一個號碼。結果顯然是有問題的。這個是線程的同步(似乎是互斥有點像,但不一樣),下一扁再說了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章