linux多線程編程5--信號量(semaphore)

信號量本質上是一個非負的整數計數器,也是UNIX中古老的實現進程互斥和同步的手段,Linux下信號量概念是在線程中,信號則在進程控制中,不過原理差不多,最基本最經典的操作莫過于P、V操作了,能實現進程、線程的互斥和同步操作,非常值得深入理解。

1.P、V操作原語

?P操作:

?proceduce P(var s:semaphore)

{

? begin

????? s:=s-1;

????? if(s<0)then W(s);

? end

}

V操作:

?proceduce V(var s:semaphore)

{

? begin

????? s:=s+1;

????? if(s<=0)then R(s);

? end

}

2.基本操作

數據類型:信號量的數據類型為結構sem_t,它本質上是一個長整型的數。

函數:

(1)sem_init

功能:???????? 用于創建一個信號量,并初始化信號量的值。

頭文件:?????? <semaphore.h>

函數原型:???? int sem_init (sem_t* sem, int pshared, unsigned int value);

函數傳入值:?? sem:信號量。

?????????????????? pshared:決定信號量能否在幾個進程間共享。由于目前LINUX還沒有實現進

?????????????????????????????? 程間共享信息量,所以這個值只能取0。

?????????????????? value:初始計算器

函數返回值:?? 0:成功。

?????????????????? -1:失敗。

(2)其他函數。

//等待信號量

int sem_wait?????? (sem_t* sem);

int sem_trywait?? (sem_t* sem);

//發送信號量

int sem_post?????? (sem_t* sem);

//得到信號量值

int sem_getvalue (sem_t* sem);

//刪除信號量

int sem_destroy?? (sem_t* sem);

功能:sem_wait和sem_trywait相當于P操作,它們都能將信號量的值減一,兩者的區別在

??????? 于若信號量的值小于零時,sem_wait將會阻塞進程,而sem_trywait則會立即返回。

??????? sem_post相當于V操作,它將信號量的值加一,同時發出喚醒的信號給等待的進程

?????? (或線程)。

??????? sem_getvalue 得到信號量的值。

??????? sem_destroy 摧毀信號量。

函數傳入值: sem:信號量。

函數返回值: 同上。

好了,了解完基本操作,繼續做一個練習:

這里用信號量實現互斥資源訪問的功能:

?

/*sem.c*/?
#include <stdlib.h>????
#include <stdio.h>????
#include <pthread.h>????
#include <semaphore.h>??
#include <errno.h>?????
?
/*全局變量*/?
int gnum = 0;??
/*信號量*/?
sem_t sem;??
/*聲明線程運行服務程序*/?
static void pthread_func_1 (void);?????
static void pthread_func_2 (void);?????
????
int main (void)?????
{?????
?/*線程的標識符*/?
? pthread_t pt_1 = 0;?????
? pthread_t pt_2 = 0;?????
? int ret = 0;?????
?
? /*信號量初始化*/?
? sem_init(&sem,0,1);??
? /*分別創建線程1、2*/?
? ret = pthread_create (&pt_1,????????? //線程標識符指針??
???????????????????????? NULL,????????? //默認屬性??
??????????????????????? (void *)pthread_func_1,//運行函數??
??????????????????????? NULL);????????? //無參數??
? if (ret != 0)?????
? {?????
???? perror ("pthread_1_create");?????
? }?????
????
? ret = pthread_create (&pt_2,????????? //線程標識符指針??
??????????????????????? NULL,?????????? //默認屬性????
??????????????????????? (void *)pthread_func_2, //運行函數??
??????????????????????? NULL);????????? //無參數??
? if (ret != 0)?????
? {?????
???? perror ("pthread_2_create");?????
? }?????
? /*等待線程1、2的結束*/?
? pthread_join (pt_1, NULL);?????
? pthread_join (pt_2, NULL);?????
????
? printf ("main programme exit!/n");????
? return 0;?????
}?????
?
/*線程1的服務程序*/?
static void pthread_func_1 (void)?????
{?????
? int i = 0;?????
???????
? for (;;)?????
? {?????
??? printf ("This is pthread1!/n");??????
??? sem_wait(&sem);???? /*等待信號量*/?????
??? sleep (1);???
??? /*臨界資源*/?
??? gnum++;??
??? printf ("Thread1 add one to num:%d/n",gnum);??
??????
??? sem_post (&sem);??????? /*釋放信號量*/?
?
?
???????
? }?????
}?????
/*線程2的服務程序*/???
static void pthread_func_2 (void)?????
{?????
? int i = 0;?????
????
? for (;;)?????
? {?????
??? printf ("This is pthread2!/n");???
??? sem_wait(&sem);???? /*等待信號量*/?
??? sleep (1);??
??? /*臨界資源*/?
??? gnum++;??
??? printf ("Thread2 add one to num:%d/n",gnum);??
??????
??? sem_post (&sem);??????? /*釋放信號量*/?
????
? }?????
????
? pthread_exit (0);?????
}

編譯,運行,可以看出和上次互斥鎖結果一樣的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253431.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【leetcode】910. Smallest Range II

題目如下&#xff1a; 解題思路&#xff1a;我的思路是先找出最大值。對于數組中任意一個元素A[i]來說&#xff0c;如果A[i] K 是B中的最大值&#xff0c;那么意味著從A[i1]開始的元素都要減去K&#xff0c;即如果有A[i] K > A[-1] - K&#xff0c;那么A[i] K 就可以作為…

CMOS圖像傳感器架構的演變

01、 引言 圖像傳感器目前用于多種應用。自 1969 年電荷耦合器件 (CCD) 發明以來&#xff0c;固態圖像傳感器已蔓延到各種消費市場&#xff0c;例如小型攝像機和數碼相機。自 2005年以來已成為主流固態圖像傳感器的 CMOS 圖像傳感器在為 CCD 開發的技術的基礎上不斷發展。除了…

Linux系統中/dev/mtd與/dev/mtdblock的區別

MTD(memory technology device內存技術設備)是用于訪問memory設備&#xff08;ROM、flash&#xff09;的Linux的子系統。MTD的主要目的是為了使新的memory設備的驅動更加簡單&#xff0c;為此它在硬件和上層之間提供了一個抽象的接口。MTD的所有源代碼在/drivers/mtd子目錄下。…

Python判斷變量的數據類型的兩種方法

2019獨角獸企業重金招聘Python工程師標準>>> 1、isinstance(變量名&#xff0c;類型) def varargsql(self, sql, *args):if isinstance(args, tuple):self.cursor.execute(sql, args)self.conn.commit() 2、通過與其他已知類型的常量進行對比&#xff08;type()&…

svn圖標的含義

http://www.cnblogs.com/genhaosan/articles/5129791.html 轉載于:https://www.cnblogs.com/wangc04/p/6400477.html

基于事件的視覺傳感器

在之前的文章里 人工智能與圖像傳感器_滄海一升的博客-CSDN博客_人工智能和傳感器的關系第一類是圖像傳感器與人工智能計算相結合,即圖像傳感器模組除了可以輸出圖像之外,還可以直接輸出人工智能算法計算的結果。另一類智能圖像傳感器則是為人工智能應用專門設計的圖像傳感器…

RocketMQ多Master多Slave模式部署

每個 Master 配置一個 Slave&#xff0c;有多對Master-Slave&#xff0c;HA采用同步雙寫方式&#xff0c;主備都寫成功&#xff0c;向應用返回成功。 優點&#xff1a;數據與服務都無單點&#xff0c;Master宕機情況下&#xff0c;消息無延遲&#xff0c;服務可用性與數據可用性…

FPGA的ip核之概念和分類

ip核之概念和分類 IP&#xff08;Intellectual Property&#xff09;內核模塊是一種預先設計好的甚至已經過驗證的具有某種確定功能的集成電路、器件或部件。它有幾種不同形式。IP內核模塊有行為&#xff08;behavior&#xff09;、結構&#xff08;structure&#xff09;和物理…

codeforces 1045 D. Interstellar battle

題目大意&#xff1a;一顆樹&#xff0c;給定每個點消失的概率&#xff0c;求出連通塊的期望值。要求支持修改消失概率的操作并且給出每次修改過后的期望值。注意被破壞的點不能算入連通塊中。 數據范圍&#xff0c;時限1S。 傳送門 D. Interstellar battle 我們考慮做有根樹的…

RecyclerView(滾動控件)的用法

1.首先在build.gradle中添加依賴庫 compile com.android.support:recyclerview-v7:24.2.1 2.修改activity_main.xml <LinearLayout ......<android.support.v7.widget.RecyclerViewandroid:id"id/recycler_view"android:layout_width"maych_parent"a…

Verilog中case(1‘b1)的使用說明

在用Verilog進行RTL代碼編寫的時候基本不會用到case(1‘b1)&#xff0c;而且一般的語法說明也如下&#xff1a; case(case_expr)condition1 : true_statement1 ;condition2 : true_statement2 ;……default : default_sta…

Cookie中文存儲頁面500問題

前段時間做cookie存儲&#xff0c;直接用的菜鳥教程中的cookie設置方法&#xff0c;方法如下&#xff1a; function setCookie(cname,cvalue,exdays) {var d new Date();d.setTime(d.getTime()(exdays*24*60*60*1000));var expires "expires"d.toGMTString();docum…

Behave用戶自定義數據類型

在step句子中, 所有的參數默認是string類型, 如果用戶想使用復雜的或者其他數據類型, 就需要了解以下bahave中的數據類型. behave的數據類型轉換器是在parse和cfparse中支持. parse模塊是string.format的逆函數. parse_type是基于parse的擴展, 簡化了自定義數據類型的產生. pa…

IC Compiler指南——數據準備

一、概述 ICC數據設置的文件關系框圖如圖&#xff1a; 后端工具在數據設置階段需要對兩大類數據進行設置&#xff0c;包括從前端設計繼承的綜合數據 以及后端設計需要的物理數據。 綜合數據主要包括前端邏輯綜合已經設置過的邏輯與時序庫文件、設計約束文件sdc以 及綜合網表文…

iOS Xcode全面剖析

前言 前幾天在公司內部做了一次關于iOS的入門分享&#xff0c;聽眾有PHP、Web、Android、測試、產品、UI等&#xff0c;主旨是力求不懂iOS的人能了解iOS的開發流程&#xff0c;聽后都能創建一個iOS項目并打印HelloWorld。&#xff08;這是背景&#xff09;你想想就這么點需求&a…

VS2013編譯OBS源碼

obs源碼來之&#xff1a;https://sourceforge.net/projects/obsproject/ 下載源碼之后直接打開sln索引文件就行 項目打開之后 obs作為啟動項 直接編譯就行&#xff0c;正常應該一下就能編譯成功。 在運行的時候可能會報錯&#xff1a; 這個問題就需要制定一下編譯輸出路徑&…

Y/C分離/2/3D濾波器

待整理http://blog.csdn.net/yangzhifu/article/details/7388101 http://wenku.baidu.com/view/f997d705cc1755270722086d.html

構建之法閱讀筆記04

敏捷開發是一系列價值觀和方法論的集合。在敏捷的大旗下&#xff0c;我們可以看到好幾種軟件開發的方法論&#xff0c;我們在這里主要分析Scrum這個方法論。 從Scrum方法論中分析&#xff0c;敏捷開發一共分四步&#xff1a; 第一步&#xff1a;找出完成產品需要做的事情——Pr…

js圖片切換

1.不同方式的圖片切換 功能點:   1.頁面默認循環切換,循環切換按鈕獲得焦點   2.點擊順序切換時,順序切換按鈕獲得焦點     點擊上一張時,當圖片為第一張時,圖片不再進行切換,圖片張數和描述也不在變動;     點擊下一張時,當圖片為最后一張時,圖片不再進行切換,圖片…