- 通過為每種事件類型分配單獨的處理線程,可以簡化處理異步事件的代碼。每個線程在進行事件處理時可以采用同步編程模式。
- 多個進程必須使用操作系統提供的復制機制才能實現內存和文件描述符的共享。而多個線程自動地可以訪問相同的存儲空間和文件描述符。
- 有些問題可以分解從而提高整個程序的吞吐量。將原來串行化執行的任務變成交叉進行,當然,這些任務必須相互獨立、互不依賴。
- 交互的程序同樣可以通過使用多線程來改善響應時間,多線程可以把程序中處理用戶輸入輸出的部分與其他部分分開。
#include <pthread.h>
int pthread_equal(pthread_t tid1, pthread_t tid2);
Returns: nonzero if equal, 0 otherwise
#include <pthread.h>
pthread_t pthread_self(void);
Returns: the thread ID of the calling thread
4. 線程創建#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
Returns: 0 if OK, error number on failure
- 線程可以簡單地從啟動例程中返回,返回值是線程的退出碼
- 線程可以被同一進程中的其他線程取消
- 線程調用pthread_exit
#include <pthread.h>
void pthread_exit(void *rval_ptr);
#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
Returns: 0 if OK, error number on failure
調用線程將一直阻塞,直到指定的線程調用pthread_exit、從啟動例程中返回或者被取消。
- 如果線程從啟動例程中返回,rval_ptr包含返回碼
- 如果線程被取消,由rval_ptr指定的內存單元就設置為PTHREAD_CANCELED
- 如果線程調用pthread_exit,rval_ptr指向的內存單元作為返回值傳遞給調用pthread_join函數的其他線程
線程可以通過調用pthread_cancel函數來請求取消同一進程中的其他線程
#include <pthread.h>
int pthread_cancel(pthread_t tid);
Returns: 0 if OK, error number on failure
#include <pthread.h>
void pthread_cleanup_push(void (*rtn)(void *), void *arg);
void pthread_cleanup_pop(int execute);
線程清理處理程序
。
- 調用pthread_exit時
- 響應取消請求時
- 用非零execute參數調用pthread_cleanup_pop時(以0調用pthread_cleanup_pop函數時,清理函數不被調用)
#include <pthread.h>
int pthread_detach(pthread_t tid);
Returns: 0 if OK, error number on failure
在變量修改時間多于一個存儲器訪問周期的處理器結構中,當存儲器讀與存儲器寫這兩個周期交叉時,這種不一致就會出現。
兩個或多個線程試圖在同一時間修改同一變量時,也需要進行同步。考慮變量增量操作的情況:
- 如果是靜態分配的互斥量,可以把它設置為常量PTHREAD_MUTEX_INITIALIZER
- 如果是動態分配(通過malloc函數)的互斥量,可以通過調用函數pthread_mutex_init進行初始化;在釋放內存前(通過free函數)需要調用pthread_mutex_destroy
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
Both return: 0 if OK, error number on failure
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex); // 成功鎖住返回0;鎖住失敗返回EBUSY,不會阻塞
int pthread_mutex_unlock(pthread_mutex_t *mutex);
All return: 0 if OK, error number on failure
6.2 避免死鎖#include <pthread.h>
#include <time.h>
int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict tsptr);
Returns: 0 if OK, error number on failure
新聞熱點
疑難解答