前言
在上一篇文章中,代碼沒有達到預期的結果,在文章的最後給出了問題所在,並給出了臨界區的概念,精確的定義可以百度一下。
既然問題是對臨界區的同時訪問,那麼只要保證同一個時刻只有一個線程對其訪問應該就能解決問題。
函數介紹
互斥鎖
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;
}
運行結果
當有線程鎖定互斥鎖後(鎖定相當於獲得該鎖的使用權),其他線程將無法對其再次鎖定,被陰塞,直到搶到該鎖(可能多個線程等待該鎖)。
從運行結果可以看出來。號碼的分配已經正常,說明線程互斥問題基本解決。
但我在分配號碼的基礎上增加了線程的啓動順序編號,得到哪個線程獲取哪一個號碼。結果顯然是有問題的。這個是線程的同步(似乎是互斥有點像,但不一樣),下一扁再說了