c++ linux 线程等待与唤醒_C++ Linux线程同步机制:POSIX信号量,互斥锁,条件变量...
線程同步機制:POSIX 信號量,互斥量,條件變量
POSIX 信號量
常用的POSIX 信號量函數為如下5個:
sem_init
sem_destroy
sem_wait
sem_trywait
sem_post
它們定義在頭文件 semaphore.h 中
它們成功時會返回 0,失敗則返回 -1 并設置 errno
sem_init
用于初始化一個未命名的信號量
定義
int sem_init( sem_t *sem, int pshared, unsigned int value );
參數
sem:要初始化的信號量
pshared:指定信號量的類型,如果為 0,表示這個信號量是當前進程的局部信號量,否則該信號量就可以在多個進程間共享
value:指定信號量的初始值
初始化一個已經被初始化的信號量將導致不可預期的結果
sem_destroy
用于銷毀信號量,釋放其占用的內核資源
定義
int sem_destroy( sem_t *sem );
參數
sem:要銷毀的信號量
銷毀一個正在被其他線程等待的信號量將導致不可預期的結果
sem_wait
以原子操作的方式將信號量的值 -1
如果信號量的值為 0,則 sem_wait 將被阻塞直到信號量有非 0 值
定義
int sem_wait( sem_t *sem );
參數
sem:等待的信號量
sem_trywait
以原子操作的方式將信號量的值 -1,它會立即返回(相當于 sem_wait 的非阻塞版本)
信號量為 0 時會返回 -1 并設置 errno 為 EAGAIN
定義
int sem_trywait( sem_t *sem );
參數
sem:等待的信號量
sem_post
以原子操作的方式將信號量的值 +1
當信號量的值 > 0 時,其他正在調用 sem_wait 等待信號量的線程將被喚醒
定義
int sem_post( sem_t *sem );
參數
sem:要釋放的信號量
互斥鎖
互斥鎖API
互斥鎖的 API 函數主要有下面五個:
pthread_mutex_init
pthread_mutex_destroy
pthread_mutex_lock
pthread_mutex_trylock
pthread_mutex_unlock
它們定義在頭文件 pthread.h 中
它們成功時會返回 0,失敗則返回錯誤碼
pthread_mutex_init
用于初始化互斥鎖
定義
int pthread_mutex_init( pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr );
參數
mutex:指向要操作的目標的互斥鎖
mutexattr:指定互斥鎖的屬性。如果設置為NULL,就表示使用默認屬性
pthread_mutex_destroy
銷毀一個互斥鎖并釋放其占用的內核資源
銷毀一個已經加鎖的互斥鎖將導致不可預期的后果
定義
int pthread_mutex_destroy( pthread_mutex_t *mutex );
參數
mutex:指向要操作的目標的互斥鎖
pthread_mutex_lock
以原子操作方式給一個互斥鎖加鎖
如果目標互斥鎖已經被鎖上,則 pthread_mutex_lock 調用將阻塞,直到該互斥鎖的占有者將其解鎖
定義
int pthread_mutex_lock( pthread_mutex *mutex );
參數
mutex:指向要操作的目標的互斥鎖
pthread_mutex_trylock
pthread_mutex_lock 的非阻塞版本,始終立即返回
當互斥鎖目標未被加鎖時,對其執行加鎖操作
當互斥鎖已經被加鎖時,返回 EBUSY
這里討論的 pthread_mutex_lock 和 pthread_mutex_trylock 的行為是針對普通鎖而言的,對于其他類型的鎖而言,這兩個加鎖函數會有不同的行為
定義
int pthread_mutex_trylock( pthread_mutex *mutex );
參數
mutex:指向要操作的目標的互斥鎖
pthread_mutex_unlock
以原子操作的方式給一個互斥鎖解鎖
如果此時有其他線程正在等待這個互斥鎖,則這些線程的某一個將獲得它
定義
int pthread_mutex_unlock( pthread_mutex *mutex );
參數
mutex:指向要操作的目標的互斥鎖
互斥鎖屬性
互斥鎖的兩種常用屬性有 pshared 和 type
pshared
指定是否允許跨進程共享互斥鎖,可選值有兩個:
PTHREAD_PROCESS_SHARED:互斥鎖可以被跨進程共享
PTHREAD_PROCESS_PRIVATE:互斥鎖只能被和鎖的初始化線程隸屬于同一個進程的線程共享
type
可選值有如下 4 種
PTHREAD_MUTEX_NORMAL(普通鎖)
互斥鎖默認的類型
當一個線程對一個普通鎖加鎖以后,其余請求該鎖的線程將形成一個等待隊列,并且在該鎖解鎖后按優先級獲得它
這種鎖類型保證了資源分配的公平性,但容易引發問題:一個線程如果對一個已經加鎖的普通鎖再次加鎖,將引發死鎖;對一個已經被其他線程加鎖的普通鎖解鎖,或者對一個已經解鎖的普通鎖再次解鎖,其后果是不可預期的
PTHREAD_MUTEX_ERRORCHECK(檢錯鎖)
一個線程如果對一個已經加鎖的檢錯鎖再次加鎖,將返回 EDEADLK
對一個已經被其他線程加鎖的檢錯鎖解鎖,或者對一個已經解鎖的檢錯鎖再次解鎖,則解鎖操作返回 EPERM
PTHREAD_MUTEX_RECURSIVE(嵌套鎖)
這種鎖允許一個線程在釋放之前多次對它加鎖而不發生死鎖
不過其他線程如果要獲得這個鎖,則當前鎖的擁有者必須執行相應次數的解鎖操作
對一個已經被其他線程加鎖的嵌套鎖解鎖,或者對一個已經解鎖的嵌套鎖再次解鎖,將返回 EPERM
PTHREAD_MUTEX_DEFAULT(默認鎖)
一個線程如果對一個已經加鎖的默認鎖再次加鎖,或者對一個已經被其他線程加鎖的默認鎖解鎖,或者對一個已經解鎖的默認鎖再次解鎖,將導致不可預期的后果
這種鎖在實現的時候可能被映射為上面三種鎖之一
操作屬性的 API 函數
# include
/* 初始化互斥鎖屬性對象 */
int pthread_mutexattr_init( pthread_mutexattr_t *attr );
/* 銷毀互斥鎖屬性對象 */
int pthread_mutexattr_destroy( pthread_mutexattr_t *attr );
/* 獲取和設置互斥鎖的 pshared 屬性 */
int pthread_mutexattr_getshared( const pthread_mutexattr *attr, int *pshared);
int pthread_mutexattr_setshared( pthread_mutexattr *attr, int pshared);
/* 獲取和設置互斥鎖的 type 屬性 */
int pthread_mutexattr_gettype( const pthread_mutexattr_t *attr, int *type );
int pthread_mutexattr_gettype( pthread_mutexattr_t *attr, int type );
條件變量
這篇講得挺好的,搬過來了
總結
以上是生活随笔為你收集整理的c++ linux 线程等待与唤醒_C++ Linux线程同步机制:POSIX信号量,互斥锁,条件变量...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《经济学人》封面文章:互联网搜索战火再燃
- 下一篇: 中国在土耳其建造电站强震中未受损:稳定保