Linux之線程處理函數


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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM