信號量--System V信號量 與 Posix信號量

      網友投稿 655 2025-04-02

      信號量是什么


      信號量是一種計數器,用來控制對多個進程/線程共享的資源進行訪問。常和鎖一同使用。

      在某個進程/線程正在對某個資源進行訪問時,信號量可以阻止另一個進程/線程去打擾。

      生產者和消費者模型是信號量的典型使用。

      為什么信號量分兩套(兩套有什么區別)

      簡要的說,Posix是“可移植操作系統接口(Portable Operating System Interface )的首字母簡寫,但它并不是一個單一的標準,而是一個電氣與電子工程學會即IEEE開發的一系列標準,它還是由ISO(國際標準化組織)和IEC(國際電工委員會)采納的國際標準。而System v是Unix操作系統眾多版本的一個分支,它最初是由AT&T在1983年第一次發布,System v一共有四個版本,而最成功的是System V Release 4,或者稱為SVR4。這樣看來,一個是Unix 的標準之一(另一個標準是Open Group),一個是Unix眾多版本的分支之一(其他的分支還有Linux跟BSD),應該來說,Posix標準正變得越來越流行,很多廠家開始采用這一標準。

      那么兩者有什么區別,或者說,應用場景:

      1、POSIX信號量常用于線程;system v信號量常用于進程的同步。

      2、從使用的角度,System V 信號量的使用比較復雜,而 POSIX 信號量使用起來相對簡單。

      3、對 POSIX 來說,信號量是個非負整數。而 System V 信號量則是一個或多個信號量的集合,它對應的是一個信號量結構體,這個結構體是為 System V IPC 服務的,信號量只不過是它的一部分。

      4、Posix信號量是基于內存的,即信號量值是放在共享內存中的,它是由可能與文件系統中的路徑名對應的名字來標識的。而System v信號量則是基于內核的,它放在內核里面。

      5、POSIX 信號量的頭文件是 ,而 System V 信號量的頭文件是

      6、Posix還有有名信號量,一般用于進程同步, 有名信號量是內核持續的。

      怎么實現呢?

      1、新建信號量

      system V

      #include #include #include int semget(key_t key,int nsems,int semflg); /* nsems:創建多少個 semflg:IPC_CREAT、IPC_EXCL; */

      1

      信號量--System V信號量 與 Posix信號量

      2

      3

      4

      5

      6

      7

      8

      9

      利用System V函數包裝建立信號量的代碼;

      typedef int sem_t; union semun { int val; struct semid_ds *buf; //semid_ds的指針 unsigned short *array; //數組類型 } arg; //定義一個全局變量 sem_t CreateSem(key_t key,int value) { union semun sem; //信號量結構變量 sem_t sem_id; sem.val = value; //設置初始值 sem_id = semget(key,0,IPC_CREAT|0666); //獲取信號量id if(sem_id == -1) { printf("create sem failed\n"); exit(-1); } semctl(sem_id,0,SETVAL,sem); //發送命令,建立value個初始信號量 return sem_id; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      Posix信號量:直接用那個函數就好了,可以加一個報錯保險。

      【后面的栗子都一樣,Posix就這么簡單】

      2、PV操作(增減信號量)

      System V

      /* 參數釋義: struct sembuf { ushort sem_num; //信號量的編號 short sem_op; //信號量的操作 {正負零} short sem_flg; //信號量的操作標志 {NOWAIT} }; //sem_op取0表示將信號量設為睡眠狀態,直到信號量的值為0為止 nsops:該數組中操作的個數 */

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      int Sem_P(sem_t semid) { struct sembuf sops = {0,+1,IPC_NOWAIT}; return (semop(semid,&sops,1)); }

      1

      2

      3

      4

      5

      intSem_V(sem_t semid) { struct sembuf sops = {0,-1,IPC_NOWAIT}; return (semop(semid,&sops,1)); }

      1

      2

      3

      4

      5

      P操作:進行增加一個信號量的值的操作

      V操作:進行減少一個信號量的值的操作

      Posix

      P:sem_post(sem_t *sem);

      V:sem_wait(sem_t *sem);

      3、控制信號量參數

      #include #include #include int semctl(int semid,int semnum,int cmd,...); /* 該函數是在信號量的集合上執行控制操作函數。 參數釋義: semnum:將要被執行操作的信號量編號。對于集合中的第一個信號量,它的值為0。 cmd: IPC_STAT:獲取某個集合的semid_ds結構,并把它存在semun聯合體的buf中。 IPC_SET:設置某個集合的semid_ds中的ipc_perm成員的值。該命令所取值從buf中獲取。 IPC_RMID:從內核刪除該集合。 GETTALL:用于獲取集合中所有的信號量的值,存放在semun聯合體的array中。 GETPID:返回最后一次調用semop的PID。 GETVAL:返回集合中某個信號量的值。 GETZCNT:返回正在等待資源利用率達到百分百的進程的數目。 SETALL:把集合中所有信號量的值設置為semun聯合體中array中的值。 SETVAL:把集合中某個信號量的值設置為semun聯合體中val的值。 */

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      //栗子就不放了

      4、銷毀信號量

      System V

      void DestroySem(sem_t semid) { union semun sem; sem.val = 0; se,ctl(semid,0,IPC_RMID,sem); }

      1

      2

      3

      4

      5

      6

      最后,放一串生產消費者的代碼

      //實現線程互斥 #include #include #include #include #include #include using namespace std; sem_t sem; void* productor(void* arg) { while(1) { sem_wait(&sem); cout << "create noodle!!!" << endl; sem_post(&sem); usleep(10); } return NULL; } void* consumer(void* arg) { while(1) { sem_wait(&sem); cout << "eat noodle!!!" << endl; sem_post(&sem); usleep(10); } return NULL; } int main() { pthread_t tid1,tid2; sem_init(&sem, 0, 1); pthread_create(&tid1, NULL, productor, NULL); pthread_create(&tid2, NULL, consumer, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); sem_destroy(&sem); return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:解密OKR考核制度,如何科學應用以提升績效
      下一篇:如何在Excel的單元格中創建或插入下拉列表?
      相關文章
      亚洲视频一区在线播放| 亚洲AV永久无码精品一区二区国产 | 亚洲成在人天堂一区二区| 亚洲麻豆精品国偷自产在线91| 亚洲AV无码一区二区乱子仑| 国内精品久久久久影院亚洲| 色噜噜亚洲男人的天堂| 亚洲熟妇无码爱v在线观看| 亚洲精选在线观看| 亚洲AV电影院在线观看| 国产成人精品日本亚洲网站| 国产亚洲AV无码AV男人的天堂| 亚洲精品无码成人片久久| 亚洲精品乱码久久久久久久久久久久 | 亚洲日产2021三区在线| 亚洲毛片免费视频| 亚洲免费视频播放| 亚洲AV无码成人专区| 亚洲 日韩 色 图网站| 亚洲精品蜜夜内射| 含羞草国产亚洲精品岁国产精品 | 337P日本欧洲亚洲大胆精品| 国产亚洲一卡2卡3卡4卡新区 | 亚洲日韩国产精品无码av| 亚洲国产美女精品久久久久| 亚洲图片激情小说| 亚洲AV成人噜噜无码网站| 亚洲AV无码国产精品色| 亚洲欧美成人av在线观看| 亚洲AV综合色区无码一二三区| 亚洲AV综合色区无码一二三区| 国产午夜亚洲精品不卡| 亚洲国产中文字幕在线观看| 亚洲欧洲中文日韩久久AV乱码| 在线精品亚洲一区二区三区| 亚洲va久久久噜噜噜久久天堂| 亚洲网红精品大秀在线观看 | 亚洲一级特黄特黄的大片| 亚洲国产成人无码AV在线影院| 另类小说亚洲色图| 久久久青草青青国产亚洲免观|