linux進程or線程安全之信號量sem_init

1忿族、信號量定義

linux sem信號量是一種特殊的變量氯檐,訪問具有原子性,用于解決進程或者線程間共享資源引發(fā)的同步問題

用戶態(tài)進程對sem信號量可以有以下兩種操作:

  1. 等待信號量
    當信號量值為0時冤寿,程序等待;當信號量值大于0時伸蚯,信號量減1, 程序繼續(xù)運行维蒙。
  2. 發(fā)送信號量
    將信號量值加1

2、相關(guān)函數(shù)說明

linux 信號量相關(guān)函數(shù)都聲明頭文件 semaphore.h 頭文件中缘揪,所以使用信號量之前需要先包含頭文件

#include <semaphore.h>

信號量的創(chuàng)建就像聲明一般的變量一樣簡單耍群,例如:sem_t sem,之后對該信號量進行初始化和使用找筝。

2.1蹈垢、信號量初始化sem_init

該函數(shù)用于信號量初始化,原型如下:

int sem_init(sem_t *sem, int pshared, unsigned int value);

改函數(shù)初始化由sem指向的sem_t對象,并給他一個初始值value.
pshared控制信號量的類型:

  1. pshared值為0用于多線程之間的同步
  2. pshared值大于0表示可以共享,用于多個相關(guān)進程間的同步
參數(shù) pshared > 0 時指定了 sem 處于共享內(nèi)存區(qū)域袖裕,所以可以在進程間共享該變量

2.2曹抬、等待信號量sem_wait

其函數(shù)原型有兩種

int sem_wait(sem_t *sem); 

int sem_trywait(sem_t *sem);

sem_wait 是一個阻塞的函數(shù),測試所指定信號量的值急鳄,它的操作是原子的谤民。若 sem value > 0,則該信號量值減去 1 并立即返回疾宏。若sem value = 0张足,則阻塞直到 sem value > 0,此時立即減去 1坎藐,然后返回为牍。

sem_trywait 函數(shù)是非阻塞的函數(shù),它會嘗試獲取獲取 sem value 值岩馍,如果 sem value = 0碉咆,不是阻塞住,而是直接返回一個錯誤 EAGAIN蛀恩。

2.3疫铜、信號量增加 sem_post

把指定的信號量 sem 的值加 1,喚醒正在等待該信號量的任意線程双谆。

int sem_post(sem_t *sem);

2.4壳咕、獲取信號量的值sem_getvalue

int sem_getvalue(sem_t *sem, int *sval);
獲取信號量 sem 的當前值,把該值保存在 sval顽馋,若有 1 個或者多個線程正在調(diào)用 sem_wait 阻塞在該信號量上谓厘,該函數(shù)返回阻塞在該信號量上進程或線程個數(shù)。

2.5趣避、 信號量銷毀 sem_destroy

該函數(shù)用于對信號量用完進行清理

int sem_destroy(sem_t *sem);

成功則返回 0,失敗返回 -1

3新翎、 一個信號量同步線程案例

下面以一個簡單的多線程例子說明如何使用信號量進行線程同步程帕。

在主線程中住练,創(chuàng)建一個子線程用于處理 resource 共享資源,如果主線程有需求(sem_post)愁拭,就往其后追加一個 ‘a(chǎn)’ 字符串讲逛。

//
// Created by 汪庭東 on 2020/4/15.
//
#include <semaphore.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>

sem_t *sem;
static char *resource[30];
void *change_resource(void* res) {
    char *msg = (char*) res;
    fprintf(stdout, "start change resource......\n");
    while (1) {
        sem_wait(sem);
        strcat(resource, "a");
        fprintf(stderr, "change value after: %s\n", msg);
    }
}
int main() {
    int err;
    pthread_t  pthread;

    sem = sem_open("/mysem",O_CREAT, S_IRUSR | S_IWUSR, 0);
    do {
        if (pthread_create(&pthread, NULL, change_resource, (void *) resource) != 0) {
            printf("pthread_create failed \n");
            err = -1;
            break;
        }
        while (1) {
            int i;
            printf("1 添加 2 阻塞 3退出\n");
            sleep(1);
            scanf("%d", &i);
            if (i == 1) {
                sem_post(sem);
            } else if(i == 2) {
                continue;
            } else if (i == 3) {
                break;
            }
        }
    } while (0);
    if (sem_destroy(sem) != 0) {
        err = -1;
    }
    return err;
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岭埠,隨后出現(xiàn)的幾起案子盏混,更是在濱河造成了極大的恐慌,老刑警劉巖惜论,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件许赃,死亡現(xiàn)場離奇詭異,居然都是意外死亡馆类,警方通過查閱死者的電腦和手機混聊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乾巧,“玉大人句喜,你說我怎么就攤上這事」涤冢” “怎么了咳胃?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旷太。 經(jīng)常有香客問我展懈,道長,這世上最難降的妖魔是什么泳秀? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任标沪,我火速辦了婚禮,結(jié)果婚禮上嗜傅,老公的妹妹穿的比我還像新娘金句。我一直安慰自己,他們只是感情好吕嘀,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布违寞。 她就那樣靜靜地躺著,像睡著了一般偶房。 火紅的嫁衣襯著肌膚如雪趁曼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天棕洋,我揣著相機與錄音挡闰,去河邊找鬼。 笑死,一個胖子當著我的面吹牛摄悯,可吹牛的內(nèi)容都是我干的赞季。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奢驯,長吁一口氣:“原來是場噩夢啊……” “哼申钩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘪阁,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撒遣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后管跺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體义黎,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年伙菜,在試婚紗的時候發(fā)現(xiàn)自己被綠了轩缤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡贩绕,死狀恐怖火的,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淑倾,我是刑警寧澤馏鹤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站娇哆,受9級特大地震影響湃累,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碍讨,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一治力、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勃黍,春花似錦宵统、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弄息,卻和暖如春痊班,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摹量。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工涤伐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馒胆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓凝果,卻偏偏與公主長得像国章,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子豆村,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容