最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java進(jìn)程間通信之消息隊列

 更新時間:2022年03月21日 14:57:48   作者:月半木斤  
這篇文章主要為大家詳細(xì)介紹了Java進(jìn)程間通信之消息隊列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

消息隊列

1.消息隊列的原理

  • 1.1 msgqueue采用鏈表來實(shí)現(xiàn)消息隊列, 該鏈表是由系統(tǒng)內(nèi)核維護(hù),
  • 1.2 系統(tǒng)中可能有很多的msgqueue, 每個MQ用消息隊列描述符(消息隊列ID: qid) 來區(qū)分,qid是唯一 的,用來區(qū)分不同的MQ。
  • 1.3在進(jìn)行進(jìn)程間通信時,一個進(jìn)程將消息加到MQ尾端,另一個進(jìn)程從消息隊列中取消息(不一 定以先進(jìn)先出來取消息,也可以按照消息類型去取消息)這樣就實(shí)現(xiàn)了進(jìn)程間的通信。

2.消息隊列的接口:

2.1創(chuàng)建消息隊列

int msgget(key_ t key, int msgflg);

參數(shù):

  • key:消息隊列的標(biāo)識符
  • msgflg:創(chuàng)建的標(biāo)志,例如IPC_CREAT
  • IPC_CREAT:如果不存在就創(chuàng)建:按位或上一個權(quán)限(8進(jìn)制的數(shù)字)

返回值:

  • 成功:返回隊列ID
  • 失敗:返回-1,并設(shè)置erron

2.2向消息隊列發(fā)送消息

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

參數(shù):

  • msgid:消息隊列ID
  • msgp:指向msgbuf 的指針,用來指定發(fā)送的消息
    • 操作系統(tǒng)為該函數(shù)發(fā)送的消息定義了發(fā)送格式,只是定義了一部分,另一部分要程序員自己去定義

  • msgsz:要發(fā)送消息的長度,消息內(nèi)容的長度
  • msgflg:創(chuàng)建標(biāo)記,如果指定IPC_NOWAIT,失敗會立即返回
    • 0:阻塞發(fā)送
    • IPC_NOWAIT:非阻塞發(fā)送

返回值:

  • 成功:返回0
  • 失?。悍祷?1,并設(shè)置erron

2.3接收消息:

ssize_t msgrcv(int msqid, void *msgp, sizet msgsz, long msgtyp, int msgflg);

參數(shù):

  • msgid:消息隊列ID
  • msgp:指向msgbuf的指針,用來接收消息
  • msgsz:要接收消息的長度
    • 注意:參數(shù)msgsz 指定由msgp 參數(shù)指向的結(jié)構(gòu)的成員mtext的最大大小(以字節(jié)為單位)

msgtyp:接收消息的方式

  • 1. msgtyp = 0:讀取隊列中的第一條消息(不在乎當(dāng)前對頭元素時什么消息類型,將他當(dāng)作普通隊列來處理)
  • 2. msgtyp > 0:讀取隊列中類型為msgtyp 的第一條消息。(就是讀取對列元素中第一個香蕉)除非在msgflg中指定了MSG_ EXCEPT, 將讀取類型不等于msgtyp 絕對值的第一條消息
  • 3. msgtyp< : 0:讀取隊列中最小類型小于或等于msgtyp 絕對值的第一條消息

msgflg:創(chuàng)建標(biāo)記,如果指定IPC_ NOWAIT,獲取失敗會立刻返回

返回值:

  • 成功返回實(shí)際讀取消息的字節(jié)數(shù)
  • 失敗返回-1,并設(shè)置erron

2.4操作消息隊列的接口

int msgctl(int msqid, int cmd, struct msqid_ ds *buf);

參數(shù):

  • msqid:消息隊列ID
  • cmd:控制命令,
    • 例如IPC_ RMID,刪除命令 ,
    • IPC STAT,獲取狀態(tài)
  • buf:存儲消息隊列的相關(guān)信息的buf

返回值:

  • 成功根據(jù)不同的cmd有不同的返回值,
  • 失敗返回-1,并設(shè)置erron

2.5代碼測試:

創(chuàng)建一個消息對列,寫端發(fā)送消息對列,讀端讀取消息對列中的內(nèi)容。

我們運(yùn)行寫端代碼兩次發(fā)現(xiàn)消息對列中寫入20條消息,

運(yùn)行讀端代碼我們發(fā)現(xiàn)成功讀出

我們運(yùn)行三次可以發(fā)現(xiàn)再無法從消息對列中讀出,說明消息對列每次獲取到消息后,就會將消息對列中相應(yīng)的消息出對列

信號量:

信號量的原理

  • 信號量本質(zhì)上就是資源計數(shù)器,能夠保證多個進(jìn)程之間訪問臨界資源,執(zhí)行臨 界區(qū)代碼時,互斥訪問。同時也可以用于同步
    • 臨界資源:多個進(jìn)程都可以訪問到的資源(例如:同一塊內(nèi)存)
    • 臨界區(qū):訪問臨界資源時的代碼,區(qū)域稱之為臨界區(qū)

互斥訪問:同一時刻,多個進(jìn)程當(dāng)中,只有一個進(jìn)程可以訪問臨界區(qū)資源。多個資源通過信號量保證互斥訪問的時候,需要先獲取信號量,如果能獲取正確的信息量,則才能訪問臨界資源,如果獲取不了,則阻塞等待。等待訪問的進(jìn)程將信號量設(shè)置為1,然后再訪問。

  • 如果不進(jìn)行互斥訪問會造成結(jié)果二義性。(結(jié)果不同)(多核cpu同時運(yùn)行多個進(jìn)程訪問臨界資源,單核搶占式執(zhí)行,操作系統(tǒng)調(diào)度不可控)
  • 同步:當(dāng)臨界資源空閑之后,通知等待的進(jìn)程進(jìn)行訪問

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • 解決java編譯錯誤:程序包不存在的問題

    解決java編譯錯誤:程序包不存在的問題

    出錯:Error:(3, 27) java: 程序包c(diǎn)om.aliyun.odps.udf不存在,遇到這樣的錯誤問題如何解決呢,下面小編給大家?guī)砹薺ava編譯錯誤:程序包不存在的問題及解決方法,感興趣的朋友一起看看吧
    2023-05-05
  • MyBatis中的SQL映射文件如何配置參數(shù)映射和使用方法

    MyBatis中的SQL映射文件如何配置參數(shù)映射和使用方法

    MyBatis 是一種開源的 Java 持久化框架,它可以自動將數(shù)據(jù)庫中的數(shù)據(jù)映射到 Java 對象中,并且使得 Java 對象可以非常方便地存儲到數(shù)據(jù)庫中,本文將介紹 MyBatis 中 SQL 映射文件的參數(shù)映射配置和使用方法,需要的朋友可以參考下
    2023-07-07
  • SpringAOP切入點(diǎn)規(guī)范及獲取方法參數(shù)的實(shí)現(xiàn)

    SpringAOP切入點(diǎn)規(guī)范及獲取方法參數(shù)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringAOP切入點(diǎn)規(guī)范及獲取方法參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中的鎖ReentrantLock詳解

    Java中的鎖ReentrantLock詳解

    這篇文章主要介紹了Java中的鎖ReentrantLock詳解,ReentantLock是java中重入鎖的實(shí)現(xiàn),一次只能有一個線程來持有鎖,包含三個內(nèi)部類,Sync、NonFairSync、FairSync,需要的朋友可以參考下
    2023-09-09
  • Java中ArrayBlockingQueue和LinkedBlockingQueue

    Java中ArrayBlockingQueue和LinkedBlockingQueue

    這篇文章主要介紹了Java中ArrayBlockingQueue和LinkedBlockingQueue,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • Java substring方法實(shí)現(xiàn)原理解析

    Java substring方法實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java substring方法實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Java中Tuple的功能及使用詳解

    Java中Tuple的功能及使用詳解

    Java中的Tuple是一種非常有用的數(shù)據(jù)結(jié)構(gòu),它可以讓開發(fā)者在處理多個數(shù)據(jù)元素時更加方便和高效,通過Tuple,我們可以將多個變量打包成一個對象,從而減少了代碼量,提高了代碼可讀性,這篇文章主要介紹了Java中Tuple的功能及使用場景,需要的朋友可以參考下
    2024-01-01
  • Java多線程編程中易混淆的3個關(guān)鍵字總結(jié)

    Java多線程編程中易混淆的3個關(guān)鍵字總結(jié)

    這篇文章主要介紹了Java多線程編程中易混淆的3個關(guān)鍵字總結(jié),本文總結(jié)了、volatile、ThreadLocal、synchronized等3個關(guān)鍵字,對這幾個容易混淆概念的關(guān)鍵字分別做了講解,需要的朋友可以參考下
    2015-03-03
  • 解決idea每次打開新的項(xiàng)目都需要重新配置maven問題

    解決idea每次打開新的項(xiàng)目都需要重新配置maven問題

    這篇文章主要介紹了解決idea每次打開新的項(xiàng)目都需要重新配置maven問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 一文帶你快速學(xué)會JDBC及獲取連接的五種方式

    一文帶你快速學(xué)會JDBC及獲取連接的五種方式

    JDBC(Java Database Connectivity)是一個獨(dú)立于特定數(shù)據(jù)庫管理系統(tǒng)、通用的SQL數(shù)據(jù)庫存取和操作的公共接口,下面這篇文章主要給大家介紹了關(guān)于如何通過一文帶你快速學(xué)會JDBC及獲取連接的五種方式,需要的朋友可以參考下
    2022-09-09

最新評論

阜城县| 乐东| 苏尼特右旗| 中牟县| 大邑县| 景宁| 太谷县| 泽州县| 焦作市| 静宁县| 梓潼县| 明星| 阜南县| 石台县| 鄂托克前旗| 上杭县| 历史| 郸城县| 黑河市| 清水县| 银川市| 泸定县| 桓仁| 渑池县| 铁力市| 镇巴县| 库车县| 太仆寺旗| 乌兰县| 东安县| 贡嘎县| 焉耆| 汾阳市| 福州市| 寻乌县| 古蔺县| 崇仁县| 水城县| 昌图县| 霸州市| 西宁市|