多執行緒:利用互斥鎖來處理全域性變數的互斥問題
多個執行緒會共享一些程序的靜態資料段的資源,比如在主執行緒中定義的全域性變數。肯定其他執行緒也能訪問的。
在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頁。