1. 程式人生 > >Linux 多執行緒同步之訊息佇列

Linux 多執行緒同步之訊息佇列

訊息佇列是訊息的連結串列,存放在核心中並有訊息佇列標示符標示。

  msgget用於建立一個新佇列或開啟一個現存的佇列。msgsnd將新訊息加入到訊息佇列中;每個訊息包括一個long型的type;和訊息快取;msgrcv用於從佇列中取出訊息;取訊息很智慧,不一定先進先出

  ①msgget,建立一個新佇列或開啟一個現有佇列

  #include <sys/msg.h>

  int msgget ( key_t key, int flag );

  //成功返回訊息佇列ID;錯誤返回-1

  ②msgsnd: 傳送訊息

  #include <sys/msg.h>

  int msgsnd( int msgid, const void* ptr, size_t nbytes, int flag )

  //成功返回0,錯誤返回-1

  a:   flag可以指定為IPC_NOWAIT;  若訊息佇列已滿,則msgsnd立即出錯返回EABAIN;

  若沒指定IPC_NOWAIT; msgsnd會阻塞,直到訊息佇列有空間為止

  ③msgrcv: 讀取訊息:

  ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long type, int flag );

  a. type == 0; 返回訊息佇列中第一個訊息,先進先出

  b. type > 0    返回訊息佇列中型別為tpye的第一個訊息

  c. type < 0    返回訊息佇列中型別 <=  |type| 的資料;若這種訊息有若干個,則取型別值最小的訊息

  訊息佇列建立步驟:

  #define   MSG_FILE "."

  struct msgtype {

  long mtype;

  char buffer[BUFFER+1];

  };

  if((key=ftok(MSG_FILE,'a'))==-1)

  {

  fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));

  exit(1);

  }

  if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)

  {

  fprintf(stderr,"Creat Message  Error:%s\n", strerror(errno));

  exit(1);

  }

  msg.mtype = 1;

  strncpy(msg.buffer, argv[1], BUFFER);

  msgsnd(msgid, &msg, sizeof(struct msgtype), 0);

  msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);

  示例程式碼:

  #include <stdio.h>

  #include <stdlib.h>

  #include <string.h>

  #include <errno.h>

  #include <sys/types.h>

  #include <sys/ipc.h>

  #include <sys/msg.h>

  #include <sys/stat.h>

  #include <pthread.h>

  #define   MSG_FILE "."

  #define   BUFFER 255

  #define   PERM S_IRUSR|S_IWUSR

  #define IPCKEY 0x111

  struct msgtype {

  long mtype;

  char buffer[BUFFER+1];

  };

  void* thr_test( void* arg ){

  struct msgtype msg;

  int msgid;

  msgid =  *((int*)arg);

  printf("msqid = %d  IPC_NOWAIT = %d\n", msgid, IPC_NOWAIT);

  time_t tt = time(0)+8;

  //while( time(0) <= tt )

  //{

  msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);

  fprintf(stderr,"Server Receive:%s\n", msg.buffer);

  msg.mtype = 2;

  msgsnd(msgid, &msg, sizeof(struct msgtype), 0);

  //}

  pthread_exit( (void*)2 );

  }

  int main(int argc, char **argv)

  {

  struct msgtype msg;

  key_t key;

  int msgid;

  pthread_t tid;

  if(argc != 2)

  {

  fprintf(stderr,"Usage:%s string\n", argv[0]);

  exit(1);

  }

  /*

  char path[256];

  sprintf( path, "%s/", (char*)getenv("HOME") );

  printf( "path is %s\n", path );

  msgid=ftok( path, IPCKEY );

  */

  if((key=ftok(MSG_FILE,'a'))==-1)

  {

  fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));

  exit(1);

  }

  if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)

  {

  fprintf(stderr,"Creat Message  Error:%s\n", strerror(errno));

  exit(1);

  }

  pthread_create( &tid, NULL, thr_test, &msgid );

  fprintf(stderr,"msid is :%d\n", msgid);

  msg.mtype = 1;

  strncpy(msg.buffer, argv[1], BUFFER);

  msgsnd(msgid, &msg, sizeof(struct msgtype), 0);

  exit(0);

  }

相關推薦

Linux 執行同步訊息佇列

訊息佇列是訊息的連結串列,存放在核心中並有訊息佇列標示符標示。   msgget用於建立一個新佇列或開啟一個現存的佇列。msgsnd將新訊息加入到訊息佇列中;每個訊息包括一個long型的type;和訊息快取;msgrcv用於從佇列中取出訊息;取訊息很智慧,不一定先進先出   ①msgget,建立一個新

Linux 執行同步哲學家用餐問題

問題描述: 有五個哲學家公用一張餐桌,分別坐在周圍的五張椅子上,在餐桌上有五個碗和五隻筷子,他們的生活方式是交替地進行思考和用餐。平時,一個哲學家進行思考,飢餓時便試圖拿取其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐,進餐完畢,放下筷子繼續思考。(計算機作業系統 第

[Linux]執行同步sem_wait()學習筆記

2、用Condition Variable實現Semaphore ,即用pthread_cond_wait()等方式實現sem_wait()等方式。 #include <stdlib.h> #include <pthread.h> #include <stdio.h>

Linux:使用執行程式設計和訊息佇列,實現兩個程序之間的聊天

思路: 一個檔案:建立一個執行緒和主函式,或者建立兩個執行緒主函式呼叫(我用這種)。 建立兩個訊息佇列, 一共兩個檔案,兩個佇列,四個程序 a.c    一個程序寫(訊息型別為1)   ---->>佇列     一個程序讀(訊息型別為2) b.c   一

Linux執行同步機制

一、互斥鎖 儘管在Posix Thread中同樣可以使用IPC的訊號量機制來實現互斥鎖mutex功能,但顯然semphore的功能過於強大了,在Posix Thread中定義了另外一套專門用於執行緒同步的mutex函式。 1. 建立和銷燬    有兩種方法建

執行同步——兩個執行序列順序列印奇數和偶數的兩種實現

題目:一道經典的執行緒併發的問題,執行緒a列印1、3、5……,執行緒b列印2、4、6……,兩個執行緒交替執行輸出1、2、3、4、5、6…… 要點: package com.test; import java.util.concurrent.locks.

Linux執行程式設計員工資訊管理系統

       員工資訊管理系統是基於Linux 多執行緒併發伺服器程式設計,由伺服器端和客戶端構成,客戶端可以執行在多個不同的主機上連線伺服器,伺服器對員工資訊的操作結果通過“員工資訊檔案”來儲存,即:“員工資訊”存放在後臺的檔案中,相當於資料庫。當用戶登入後,根據使用者名稱

Linux 執行同步問題 條件變數

互斥鎖:用來上鎖。 條件變數:用來等待,當條件變數用來自動阻塞一個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。 函式介紹: 1. 名稱: pthread_cond_init 目標: 條件變數初始化 標頭檔案: #include &

Linux執行同步機制 .linux執行程式設計機制

#include <stdio.h> #include <pthread.h> #include <unistd.h> pthread_mutex_t mutex; pthread_cond_t  cond; void * child1(void *arg) {      

C++執行同步Mutex(互斥量)

一、互斥量Mutex同步多執行緒 1、Win32平臺 相關函式和標頭檔案 #include <windows.h> HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes

Linux 執行同步與互斥

1.同步 同一個程序中的多個執行緒共享所在程序的記憶體資源,當多個執行緒在同一時刻同時訪問同一種共享資源時,需要相互協調,以避免出現數據的不一致和覆蓋等問題,執行緒之間的協調和通訊的就叫做執行緒的同步問題, 執行緒同步的思路: 讓多個執行緒依次訪問共享資源,而不是並行 我

執行同步事件 -- 2個執行交替列印數字

    有段時間沒有接觸多執行緒相關的知識了,難免會遺忘或者生疏。多執行緒通訊和同步相關的知識運用比較廣,而且比較常見。今天通過2個執行緒交替列印數字的例子,來整理下多執行緒序相關的程式設計方式。這裡2個執行緒直接通過一個event進行同步。     我們通過CreateE

Java執行同步Lock用法

從JDK5.0開始,有兩種機制來保護程式碼塊不受到並行訪問的干擾。舊版本的Java使用synchronized關鍵字來達到這個目的,而JDK5.0引進了ReentrantLock()類。synchronize關鍵字自動提供一個鎖和相關的條件。 用Reentra

C++執行同步Semaphore(訊號量)

一、執行緒間同步的幾種方式 從上篇博文中可以發現,當多個執行緒對同一資源進行使用時,會產生“爭奪”的情況,為了避免這種情況的產生,也就出現了執行緒間的同步這個技術。執行緒間的同步有多種方式,在接下來的博文中我會依次介紹幾種主流的同步方式,以及他們之間的區別。在

linux執行程式設計互斥鎖

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <unistd.h> #include <pthread.h>

C++執行同步事件(Event)

一、事件(Event)原理解析 1、執行緒同步Event,主要用於執行緒間的等待通知。 2、核心物件中,事件核心物件是個最基本的物件。 3、事件包含一個使用計數(與所有核心物件一樣),一個用於指明該事件是個自動重置的事件還是人工重置的事件的布林值,另一個用

執行同步LockSupport

多執行緒同步的方式有很多種,synchronized,wait/notify,lock/condition等,這裡介紹一下 LockSupport。 對於傳統的wait/notify這種比較low的做法,1,要自己維護一套鎖物件;2,必須在同步程式碼塊中使用,

執行同步 CriticalSection(臨界區)

先看一段程式, 程式碼檔案: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCt

Linux程式設計學習筆記----執行程式設計執行同步條件變數

轉載請註明出處:http://blog.csdn.net/suool/article/details/38582521. 基本概念與原理 互斥鎖能夠解決資源的互斥訪問,但是在某些情況下,互斥並不能解決問題,比如兩個執行緒需 要互斥的處理各自的操作,但是一個執行緒的操作僅僅存

linux執行同步機制訊號量、互斥量、讀寫鎖、條件變數

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