日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c++ linux 线程等待与唤醒_C++ Linux线程同步机制:POSIX信号量,互斥锁,条件变量...

發布時間:2023/12/15 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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信号量,互斥锁,条件变量...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。