线程互斥和同步-- 互斥锁
生活随笔
收集整理的這篇文章主要介紹了
线程互斥和同步-- 互斥锁
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一. 線程分離
我們一般創建的線程是可結合的,這個時候如果我們調用pthread_jion()去等待的話,這種等待的方式是阻塞式等待,如果主線程一直等待,主線程就無法做其他的事情了,所以應該使用線程分離,讓子線程由操作系統回收,主線程就不管了。
不管線程是否分離,它始終是在進程的內部執行的。
使用的函數接口是pthread_detach(pthread_t pid)
如果分離自己參數為pthread_self(),如果是主線程分離子線程,參數為pthread_id
二. 線程互斥
因為我們的多個線程是共享一個資源的,這個資源就是臨界資源,多個線程對資源的訪問就需要使用線程的同步和互斥
互斥,對資源的訪問時串行的,原子的。即是,每次只能有一個線程訪問臨界 資源。
三.線程同步
如果我們的某一個線程的優先級特別高,那么它可能會一直占據這這臨界資源,這個時候,其他的線程就無法使用這個臨界資源,雖然我們實現了線程的互斥,但是只有一個線程 使用它,這也是不符合我們的實際需求的,所以這個時候需要使用線程的同步。
線程同步的意思就是說,每次使用完一個臨界資源之后,都需要排隊,打個形象的比喻就是,如果我們一個人進入一個單獨自習室自習之后,出來的時候,必須排在其他的排在門口的人后面,不能直接出來又進去,這樣的話,他就是一直占據著臨界資源了。
四. 互斥鎖
設置一個互斥鎖,這個時候一次,創建一個全局的互斥鎖。
在線程函數里面,每次一個線程 訪問的臨界資源的時候,首先要做的是就是獲取這個鎖,只有拿到鎖之后才能對臨界資源進行操作,然后每次在退出臨界資源之前,要解鎖,這樣其他的線程進入的時候才不會永遠拿不到鎖。
整個函數結束前,要銷毀鎖。
對于互斥鎖的一個深層次的理解 1. 互斥鎖本身就是一個臨界資源,所以對互斥鎖的操作本身就是原子的。 2. 每次在線程 函數的內部,每次需要申請鎖資源,如果申請失敗,當前的線程就會被掛起,掛起就是該線程的PCB在等待隊列里面。
死鎖產生的情景 1. 多線程可能有多把鎖,這個時候,如果其中的某些線程 都想要訪問彼此的鎖,這個時候可能 都拿不到,然后就產生了死鎖。 2. 一個進程一把鎖,可能由于代碼錯誤,當它申請鎖之后,已經 拿到了這把鎖,然后他又去申請同樣 的,這個時候就出現了死鎖。
下面看代碼的實現。
對于互斥鎖的一個深層次的理解 1. 互斥鎖本身就是一個臨界資源,所以對互斥鎖的操作本身就是原子的。 2. 每次在線程 函數的內部,每次需要申請鎖資源,如果申請失敗,當前的線程就會被掛起,掛起就是該線程的PCB在等待隊列里面。
死鎖產生的情景 1. 多線程可能有多把鎖,這個時候,如果其中的某些線程 都想要訪問彼此的鎖,這個時候可能 都拿不到,然后就產生了死鎖。 2. 一個進程一把鎖,可能由于代碼錯誤,當它申請鎖之后,已經 拿到了這把鎖,然后他又去申請同樣 的,這個時候就出現了死鎖。
下面看代碼的實現。
#include<stdio.h>
#include<pthread.h>
int count = 0; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; //創建一把鎖,使用宏進行初始化void* pccount(void* arg)
{int i = 0;int temp = 0;while(i<50000000){pthread_mutex_lock(&lock); //加鎖,如果鎖資源是空,就拿到鎖,如果鎖資源不是空,就掛起等待// temp=count;count=count+1;//printf("%d",temp);i++;pthread_mutex_unlock(&lock); //操作完臨界資源之后,要解鎖,這樣其他的線程才能夠獲取鎖資源}
// printf("%d\n",count);pthread_exit((void*)123);
}int main()
{pthread_t pid1;pthread_t pid2;int i = pthread_create(&pid1,NULL,pccount,NULL);int m = pthread_create(&pid2,NULL,pccount,NULL);void* join1;void* join2;pthread_join(pid1,&join1);pthread_join(pid2,&join2); //這里必須要有線程等待,不然沒有打印結果pthread_mutex_destroy(&lock); //銷毀鎖資源printf("%d\n",count);return 0;}
總結
以上是生活随笔為你收集整理的线程互斥和同步-- 互斥锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 勾搭男神求建议 经验丰富着进!!急!?
- 下一篇: 哈希--直接定值法和除留取余法