Linux複習:pthread的cond和mutex

進程和和線程

線程和進程部分操作對比

互斥鎖mutex

這一篇文章描述pthread的創建和分離,等待

在操作系統中,有臨界區的概念。臨界區內放的一般是被1個以上的進程或線程(以下只說進程)共用的數據。
臨界區內的數據一次只能同時被一個進程使用,當一個進程使用臨界區內的數據時,其他需要使用臨界區數據的進程進入等待狀態。
操作系統需要合理的分配臨界區以達到多進程的同步和互斥關係,如果協調不好,就容易使系統處於不安全狀態,甚至出現死鎖現象。
摘自百科

那麼於是需要mutex來阻塞其他線程,於是

pthread_mutex_lock()
...
//臨界區(將其轉化爲“原子操作”)
...
//解鎖
pthread_mutex_unlock()

mutex有靜態和動態2種

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
//靜態

//動態
int pthread_mutex_init(pthread_mutex_t *restrict mutex, \
const pthread_mutexattr _t *restrict attr);   
//mutex:要初始化的互斥量  ;  attr:屬性,先設置爲NULL


int pthread_mutex_destroy(pthread_mutex_t *mutex)//銷燬動態初始化的mutex

下面舉例說明

int some=0;

pthread_mutex_t lock;
void *route(void* arg){
	pthread_mutex_unlock(&lock);
	some++;
	pthread_mutex_lock(&lock);
}
int main(){
  pthread_t t1,t2,t3;

  pthread_mutex_init(&lock, NULL);//動態分配

  pthread_create(&t1, NULL, route, (void*)"thread 1 ");
  pthread_create(&t2, NULL, route, (void*)"thread 2 ");
  pthread_create(&t3, NULL, route, (void*)"thread 3 ");
  
  pthread_join(t1, NULL);
  pthread_join(t2, NULL);
  pthread_join(t3, NULL);
  
  pthread_mutex_destroy(&lock);
}

線程的條件變量

何爲同步
同步 概念主要當某個線程可以修改變量,而其他線程也可以讀取或修改這個變量的時候,就需要對這些線程進行同步,以確保它們在訪問變量的存儲內容時不會訪問到無效的數值。
在Linux中,可以理解爲一個線程需要等待另外一個線程完成某個條件變量,才能繼續
自己,否則掛起自己。

掛起和阻塞

順便複習掛起和阻塞的區別
線程的阻塞與掛起
掛起:一般是主動的,由系統或程序發出
阻塞:一般是被動的,在搶佔資源中得不到資源,被動的掛起在內存,等待某種資源或信號量(即有了資源)將他喚醒。(釋放CPU,不釋放內存)

同步意義

當多個控制線程共享相同的內存時,需要確保每個線程看到一致的數據視圖。如果每個線程使用的變量都是其他線程不會讀取或修改的,那麼就不會存在一致性問題。同樣地,如果變量是隻讀的,多個線程同時讀取該變量也不會有一致性問題。但是,當某個線程可以修改變量,而其他線程也可以讀取或修改這個變量的時候,就需要對這些線程進行同步,以確保它們在訪問變量的存儲內容時不會訪問到無效的數值。

在《UNIX環境高級編程》中提及

這裏是引用

互斥鎖

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