1. 程式人生 > >多執行緒:利用互斥鎖來處理全域性變數的互斥問題

多執行緒:利用互斥鎖來處理全域性變數的互斥問題

多個執行緒會共享一些程序的靜態資料段的資源,比如在主執行緒中定義的全域性變數。肯定其他執行緒也能訪問的。

在Unix, Linux平臺下,我們利用互斥鎖來處理全域性變數的互斥問題。

考查互斥鎖變數,利用互斥鎖變數專門關聯一個變數。

資料型別: pthread_mutex_t

初始化: pthread_mutex_t macPIB_mutex = PTHREAD_MUTEX_INITIALIZER;

操作函式::

int pthread_mutex_lock(pthread_mutex_t *mutex) //加鎖函式,如果mutex被鎖住了,此函式會阻塞程式,直到那個鎖被釋放。

int pthread_mutex_unlock(pthread_mutex_t *mutex) //解鎖函式

互斥鎖變數適合於防止同時訪問某個共享變數,但是我們需要在等待某個條件發生期間讓我們進入睡眠,而不是一直的輪詢的查詢。可以使用 條件變數的資料型別。

考查條件變數

資料型別: pthread_cond_t

初始化:pthread_cond_t count_cond = PTHREAD_COND_INITIALIZER;

操作函式:

int pthread_cond_wait (pthread_cond_t *condptr, pthread_mutex_t *mutexptr)

int pthread_cond_signal (pthread_cond_t *condptr)

注意,我們使一個全域性變數,同時關聯上一個互斥鎖和一個條件變數。

然後如果在呼叫pthread_cont_wait的時候,已經被鎖住了,則睡眠,同時釋放mutexptr鎖。

具體解釋見UNIX網路程式設計的604-606頁。

以上是關於多個執行緒對共享變數訪問的互斥等問題。

我們在建立執行緒時,主執行緒需要給執行緒函式傳遞引數,注意,那個引數一定要注意,不能傳指標。可以傳值(C語言函式呼叫拷貝引數,支援);或者在傳之前,動態分配一個記憶體。具體的例子見UNIX網路程式設計的588-589頁。