第十一章 線程
線程也有線程ID用pthread_t 表示
每個系統對pthread_t 的定義不同。
int pthread_equal(pthread_t tid1, pthread_ttid2)
獲得線程的線程ID
pthread_t pthread_self()
創建線程
int pthread_create(pthread_t *tid, const pthread_atrr_t*attr, void* (*start_rtn)(void*). void* arg);
每個線程都有自己的棧空間和errno變量
線程可以有三種方式退出
1 線程只是從啓動例程返回,返回值是退出碼
2 線程可以被同一個進程的其他線程取消
3 線程調用phread_exit();
void pthread_exit(void * reval);
int pthread_join(pthread_t thread, void**reval);
調用線程將一直阻塞可知道指定的線程返回。
取消線程
線程可以調用pthread_cancel(pthread_t tid);
int pthread_cancel(pthread_t tid);
線程清理函數
void pthread_cleanup_push(void(*rtn)(void*), void* arg);
void pthread_pop(int execute);
什麼時候調用這些清理函數
1 線程調用pthread_exit
2 響應取消請求的時候
3 用非零execute參數調用pthread_cleanup_pop的時候
使線程分離,這樣就不用調用phread_join去獲取線程的狀態了,讓操作系統來回收線程的資源。
int pthread_detach(pthread_t tid);
還可以phread_create的時候對傳入的屬性,設置爲分離狀態
線程同步:
互斥量:
初始化和destroy
int pthread_mutex_init(pthread_mutex_t*mutex, const pthread+_mutexattr_t *attr)
int pthread_mutex_destroy(phtread_mutex_t*mutex);
加鎖和解鎖
int pthread_mutex_lock(pthread_mutex_t*mutex);
int pthread_mutex_trylock(pthread_mutex_t*mutex);
int pthread_mutex_unlock(pthread_mutex_t*mutex);
讀寫鎖:
初始化和destroy
int pthread_rwlock_init(pthread_rwlock_t*rwlock, const pthread_rwlockattr_t * attr);
int pthread_rwlock_destroy(pthread_rwlock_t*rwlock);
加鎖和解鎖
int pthread_rwlock_rdlock(pthread_rwlock_t*rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t* rwlock);
intpthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
intpthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
條件變量:
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *attr);
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *cond, phtread_mutex_t *mutex);
int pthread_cond_signal(phtread_cond_t*cond)//發送信號
int pthread_cond_broadcast(pthread_cond_t*cond)