1. 程式人生 > >linux 訊號量實現互斥操作

linux 訊號量實現互斥操作

本次程式實現了通過訊號量來實現父程序與子程序互斥操作,當父程序執行列印操作時子程序被阻塞,當子程序執行列印操作時父程序阻塞。

實現程式碼如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
#include <signal.h>

int semId;
int SIZE = 1;

union semun {
               int              val;    /* Value for SETVAL */
               struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
               unsigned short  *array;  /* Array for GETALL, SETALL */
               struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                           (Linux-specific) */
};

void Handle(int s){
  if(s == 2){
    semctl(semId,0,IPC_RMID);
    exit(0);
  }
}


int main(){
  signal(2,Handle);

  key_t key = ftok(".",4);
  semId = semget(key,1,IPC_CREAT | IPC_EXCL | 0666);
  
  union semun val;
  val.val = SIZE;

  if(semctl(semId,0,SETVAL,val) == -1){
    printf("semctl error!\n"); 
    exit(0);
  }

  struct sembuf p;
  p.sem_num = 0;
  p.sem_op = -1;
  p.sem_flg = 0;

  struct sembuf v = {0,1,0}; 

  if(fork() > 0){ 

    while(1){
      semop(semId,&p,1);
      printf("father go go go!!!\n");
      sleep(1);
      printf("father go go go!!!\n");
      sleep(1);
      printf("father go go go!!!\n");
      semop(semId,&v,1);
    }
  }

  else{
    while(1){ 
      semop(semId,&p,1);
      printf("child go go go!!!\n");
      sleep(1);
      printf("child go go go!!!\n");
      sleep(1);
      printf("child go go go!!!\n");
      semop(semId,&v,1);
    }
  }

  return 0;
}

實現結果如下:


相關推薦

linux 訊號實現互斥操作

本次程式實現了通過訊號量來實現父程序與子程序互斥操作,當父程序執行列印操作時子程序被阻塞,當子程序執行列印操作時父程序阻塞。實現程式碼如下:#include <stdio.h> #include <unistd.h> #include <stdl

Linux利用訊號實現執行緒的同步與互斥

執行緒使用互斥鎖可以實現執行緒間的互斥,而互斥鎖本身就是對資源的一種標識狀態,當可以申請到鎖時說明此時資源可以使用,當申請鎖失敗時說明資源此時被其他執行緒所佔用不可使用,我們可以使用訊號量來代替互斥鎖實現。 訊號量用來表示資源數目,當一個執行緒要去訪問資源時,必須先去申請

Linux】執行緒總結:執行緒同步 -互斥鎖,條件變數,訊號實現多生產者多消費者模型

學習環境 :  Centos6.5 Linux 核心 2.6 Linux執行緒部分總結分為兩部分:(1)執行緒的使用 ,(2)執行緒的同步與互斥。 第一部分執行緒的使用主要介紹,執行緒的概念,建立執行緒,執行緒退出,以及執行緒的終止與分離。【完

利用訊號和PV操作實現程序互斥和同步問題

在計算機作業系統中,PV操作是程序管理中的難點。 首先應弄清PV操作的含義:PV操作由P操作原語和V操作原語組成(原語是不可中斷的過程),對訊號量進行操作,具體定義如下:     P(S):①將訊號量S的值減1,即S=S-1;            ②如果S>=0,則該

Linux基礎(四)——訊號與PV操作

在計算機作業系統中,PV操作是程序管理中的難點。1、基本含義      什麼是訊號量?訊號量(semaphore)的資料結構為一個值和一個指標,指標指向等待該訊號量的下一個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的

Linux c++,用訊號實現消費者生產者佇列(程式碼可直接通過編譯)

//用訊號量實現的一個消費者生產者佇列, #include <iostream> #include <pthread.h> #include <semaphore.h> #include <errno.h> #include <queue>

linux多執行緒程式設計(C):訊號實現的執行緒安全佇列

用訊號量實現的執行緒安全佇列。 簡單有用的示例程式, 比起互斥量的實現在多執行緒時效率更好。 cir_queue.h /* * \File * cir_queue.h * \Brief * circular queue */#ifndef __CIR_QUEUE_H_

Linux核心同步機制之訊號互斥

訊號量:訊號量(semaphore)是程序間通訊處理同步互斥的機制。是在多執行緒環境下使用的一種措施,它負責協調各個程序,以保證他們能夠正確、合理的使用公共資源。 它和spin lock最大的不同之處就是:無法獲取訊號量的程序可以睡眠,因此會導致系統排程。原理訊號量一般可以用

訊號 實現程序互斥與同步

訊號量基本術語 現代計算機系統中,多個程序可以併發執行,程序間必然存在共享資源和相互合作的問題。 同步主要是使用者多個程序相互協作,共同完成任務,是程序間的直接制約問題;互斥則主要是為了多個程序分時使用有限的資源。 訊號量(semaphore)是1965

Linux C++Timer(用訊號實現)

#include <stdio.h> #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <signal.h>

linux下多執行緒同步機制之訊號互斥、讀寫鎖、條件變數

之前有寫過類似的部落格,這東西不用老忘,現在又有更清晰的理解了。 一、訊號量 編譯時候加入-lrt 訊號量最基本的兩個操作就是PV操作:P()操作實現訊號量減少,V()操作實現訊號量的增加 訊號量的值取決於訊號量的型別,訊號量的型別有多種: (1)二進位制訊號量:0與1.

訊號:整型、記錄型訊號以及利用訊號實現程序互斥和前驅關係

訊號量機構是一種功能較強的機制,可用來解決互斥與同步的問題,它只能被兩個標準的原語wait(S)和signal(S)來訪問,也可以記為“P操作”和“V操作”。原語是指完成某種功能且不被分割不被中斷執行的操作序列,通常可由硬體來實現完成不被分割執行特性的功能。如前述的“Tes

【ARM&LinuxLinux訊號互斥程式設計

《訊號量互斥程式設計示例演示》 /**************************************************************************************** * 檔名: a_pro.c * 建立者:

linux】系統程式設計-6-POSIX標準下的訊號互斥

[toc] --- ## 前言 [原文](https://www.cnblogs.com/lizhuming/p/14299764.html) ## 8. POSIX訊號量 ### 8.1 概念 * 訊號量(Semaphore)是一種實現程序/執行緒間通訊的機制,可以實現程序/執行緒之間同步或臨界資源的

關於Linux訊號的理解和探討(別說看不懂,耐心看完,你會恍然大悟~)

工作環境(藍色粗體字為特別注意內容) 1,實驗環境:Linux2.6 2,參考文獻:https://www.cnblogs.com/LZYY/p/3453582.html 最近在操作裝置檔案的時候,要求使用獨佔模式使用串列埠裝置,即一個程序用完之後釋放該串列埠,供其他程序使用。該如何實現該

易學筆記-系統分析師考試-第3章 作業系統基本原理/3.2 程序管理/3.2.2 訊號與PV操作

程序制約方式 間接相互制約:也稱為程序互斥;程序A與程序B都需要資源C(例如印表機),系統已將C分配給A使用,等待A使用完成後系統再將C分配給B使用 直接相互制約:也稱為程序同步;A通過緩衝區向B提供資料,當緩衝區為空時B不能獲取資料而阻塞;當A把資料放入緩衝區後B將被喚醒

訊號互斥鎖、讀寫鎖和條件變數之間的區別

訊號量 強調的是執行緒(或程序)間的同步:“訊號量用在多執行緒多工同步的,一個執行緒完成了某一個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作(大家都在sem_wait的時候,就阻塞在那裡)。當訊號量為單值訊號量是,也可以完成一個資源的互斥訪問。 有名

有關訊號和PV操作的易(粗)懂(淺)理解

大概只有作業系統老師佈置的作業(要交)能讓我認真學習吧…… 訊號量Semaphore 1.有關訊號量的一些說明: 訊號量S是一個整數,S大於等於零時代表可供併發程序使用的資源實體數,但S小於零時

Linux訊號sem_t簡單例項運用

sem_t sem;  定義一個訊號量變數。使用時需首先使用sem_init()函式初始化。  在多執行緒程式設計中,想讓某個執行緒阻塞等待,減少cpu佔用,在該需要執行時才執行。使用訊號量一個A執行緒sem_wait(),阻塞等待;一個B執行緒在需要執行A執行緒時sem_p

簡單應用訊號實現程序同步控制

               --------參考文獻   W.Richard Stevens, Stephen A.Rago.UNIX環境高階程式設計[M].北京:人民郵電出版社,2014.6:45