2024-06-25 19:29:23
- 通過為每種事件類型分配單獨的處理線程,可以簡化處理異步事件的代碼。每個線程在進行事件處理時可以采用同步編程模式。
- 多個進程必須使用操作系統(tǒng)提供的復(fù)制機制才能實現(xiàn)內(nèi)存和文件描述符的共享。而多個線程自動地可以訪問相同的存儲空間和文件描述符。
- 有些問題可以分解從而提高整個程序的吞吐量。將原來串行化執(zhí)行的任務(wù)變成交叉進行,當然,這些任務(wù)必須相互獨立、互不依賴。
- 交互的程序同樣可以通過使用多線程來改善響應(yīng)時間,多線程可以把程序中處理用戶輸入輸出的部分與其他部分分開。
#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 thread4. 線程創(chuàng)建#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
- 線程可以簡單地從啟動例程中返回,返回值是線程的退出碼
- 線程可以被同一進程中的其他線程取消
- 線程調(diào)用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調(diào)用線程將一直阻塞,直到指定的線程調(diào)用pthread_exit、從啟動例程中返回或者被取消。
- 如果線程從啟動例程中返回,rval_ptr包含返回碼
- 如果線程被取消,由rval_ptr指定的內(nèi)存單元就設(shè)置為PTHREAD_CANCELED
- 如果線程調(diào)用pthread_exit,rval_ptr指向的內(nèi)存單元作為返回值傳遞給調(diào)用pthread_join函數(shù)的其他線程
線程可以通過調(diào)用pthread_cancel函數(shù)來請求取消同一進程中的其他線程
#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);線程清理處理程序。
- 調(diào)用pthread_exit時
- 響應(yīng)取消請求時
- 用非零execute參數(shù)調(diào)用pthread_cleanup_pop時(以0調(diào)用pthread_cleanup_pop函數(shù)時,清理函數(shù)不被調(diào)用)

#include <pthread.h>int pthread_detach(pthread_t tid); Returns: 0 if OK, error number on failure在變量修改時間多于一個存儲器訪問周期的處理器結(jié)構(gòu)中,當存儲器讀與存儲器寫這兩個周期交叉時,這種不一致就會出現(xiàn)。
兩個或多個線程試圖在同一時間修改同一變量時,也需要進行同步。考慮變量增量操作的情況:
- 如果是靜態(tài)分配的互斥量,可以把它設(shè)置為常量PTHREAD_MUTEX_INITIALIZER
- 如果是動態(tài)分配(通過malloc函數(shù))的互斥量,可以通過調(diào)用函數(shù)pthread_mutex_init進行初始化;在釋放內(nèi)存前(通過free函數(shù))需要調(diào)用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 failure6.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新聞熱點
疑難解答