Linux的線程處理函數需包含頭文件:#include <pthread.h>
一、線程函數:成功則返回0,出錯則返回錯誤編號
1 線程創建
- int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn)(void *), void *arg);
2 線程終止
- void pthread_exit(void *rval_ptr);
3 線程等待:只能用於等待非分離線程
- int pthread_join(pthread_t thread, void **rval_ptr);
4 線程取消
- int pthread_cancel(pthread_t tid);
5 線程分離:使得線程終止時其資源立即被系統回收,而非分離狀態則需要pthread_join來釋放資源
- int pthread_detach(pthread_t tid);
6 獲取線程ID
- pthread_t pthread_self(void); //返回調用線程的線程ID
二、同步函數:成功則返回0,出錯則返回錯誤編號
1 互斥量
(1)初始化和銷毀
- pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
- int pthread_mutex_destroy(pthread_mutex_t *mutex);
(2)加鎖
- int pthread_mutex_lock(pthread_mutex_t *mutex);
- int pthread_mutex_trylock(pthread_mutex_t *mutex);
- int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *tsptr);
(3)解鎖
- int pthread_mutex_unlock(pthread_mutex_t *mutex);
2 條件變量:和互斥量mutex搭配一起使用
(1)初始化和銷毀
- pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
- int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
- int pthread_cond_destroy(pthread_cond_t *cond);
(2)等待條件變量
- int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
- int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *tsptr);
(3)發信號
- int pthread_cond_signal(pthread_cond_t *cond);
- int pthread_cond_broadcast(pthread_cond_t *cond);
代碼舉例:
1 //1 等待條件 2 pthread_mutex_lock(&lock); ------上鎖 3 while(條件不成立) 4 { 5 pthread_cond_wait(&cond); ------條件不成立時掛起等待(注意是while) 6 } 7 進行操作...... ------修改、操作 8 pthread_mutex_unlock(&lock); ------解鎖 9 10 //2 給條件發信號 11 pthread_mutex_lock(&lock); ------上鎖 12 設置條件為真... ------符合條件 13 pthread_cond_signal(&cond); ------喚醒 14 pthread_mutex_unlock(&lock); ------解鎖
注意:如果是只有一個資源且廣播信號讓多個線程等到條件,為防止除第一個以外的線程誤以為拿到資源,所以用while循環而不是if語句;
3 讀寫鎖
(1)初始化和銷毀
- int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
- int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
(2)加讀鎖
- int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
- int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
- int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock, const struct timespec *tsptr);
(3)加寫鎖
- int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
- int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
- int pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock, const struct timespec *tsptr);
(4)解鎖
- int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
4 自旋鎖
(1)初始化和銷毀
- int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
- int pthread_spin_destroy(pthread_spinlock_t *lock);
(2)加鎖
- int pthread_spin_lock(pthread_spinlock_t *lock);
- int pthread_spin_trylock(pthread_spinlock_t *lock)
(3)解鎖
- int pthread_spin_unlock(pthread_spinlock_t *lock);
三、線程屬性函數:成功則返回0,出錯則返回錯誤編號
1 初始化和銷毀
- int pthread_attr_init(pthread_attr_t *attr);
- int pthead_attr_destroy(pthread_attr_t *attr);
2 分離屬性---PTHREAD_CREATE_DETACHED
- int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
- int pthread_attr_setdetachstate(const pthread_attr_t *attr, int detachstate);
3 棧屬性
- int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
- int pthread_attr_setstacksize(const pthread_attr_t *attr, size_t stacksize);
四、同步屬性函數
1 互斥量
(1)初始化和銷毀
- int pthread_mutexattr_init(pthread_mutexattr_t *attr);
- int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
(2)進程共享屬性---PHTEAD_PROCESS_PRIVATE(默認值)或PTHREAD_PROCESS_SHARED
- int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr, int *pshared);
- int pthread_mutexattr_setpshared(const pthread_mutexattr_t *attr, int pshared);
(3)健壯屬性:解決持有互斥量的進程意外終止卻沒有釋放互斥量---PTHREAD_MUTEX_STALLED(默認值)或PTHREAD_MUTEX_ROBUST
- int pthread_mutexattr_getrobust(const pthread_mutexattr_t *attr, int *robust);
- int pthread_mutexattr_setrobust(const pthread_mutexattr_t *attr, int robust);
- int pthread_mutexattr_consistent(const pthread_mutexattr_t *attr);??????
(4)類型屬性---PHREAD_MUTEX_RECURSIVE
- int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
- int pthread_mutexattr_settype(const pthread_mutexattr_t *attr, int type);
2 條件變量
(1)初始化和銷毀
- int pthread_condattr_init(pthread_condattr_t *attr);
- int pthread_condattr_destroy(pthread_condattr_t *attr);
(2)進程共享屬性---同互斥量mutex
- int pthread_condattr_getpshared(pthread_condattr_t *attr, int *pshared);
- int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared);
(3)時鍾屬性:控制pthead_cond_timedwait函數的超時參數采用哪個時鍾---CLOCK_REALTIME或CLOCK_MONOTONIC
- int pthread_condattr_getclock(pthread_condattr_t *attr, clockid_t *clock_id);
- int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id);
3 讀寫鎖
(1)初始化和銷毀
- int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
- int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
(2)進程共享屬性---同互斥量mutex
- int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, int *pshared);
- int pthread_rwlockattr_setpshared(const pthread_rwlockattr_t *attr, int pshared);