国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【設(shè)計模式】C語言使用共享內(nèi)存和信號量,完美實現(xiàn)生產(chǎn)者與消費者模式

這篇具有很好參考價值的文章主要介紹了【設(shè)計模式】C語言使用共享內(nèi)存和信號量,完美實現(xiàn)生產(chǎn)者與消費者模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

生產(chǎn)者與消費者模式 適用場景

生產(chǎn)者和消費者模式適用于生產(chǎn)者和消費者之間存在數(shù)據(jù)交換的場景。在這種模式中,生產(chǎn)者負(fù)責(zé)生產(chǎn)數(shù)據(jù)并將其放入緩沖區(qū),而消費者負(fù)責(zé)從緩沖區(qū)中取出數(shù)據(jù)并進行處理。這種模式的優(yōu)點是可以實現(xiàn)生產(chǎn)者和消費者之間的解耦,使得它們可以獨立地進行操作,從而提高了系統(tǒng)的并發(fā)性和可擴展性。

生產(chǎn)者和消費者模式適用于許多場景,例如:

  1. 操作系統(tǒng)中的進程和線程之間的通信;
  2. 數(shù)據(jù)庫系統(tǒng)中的讀寫操作;
  3. 網(wǎng)絡(luò)通信中的數(shù)據(jù)傳輸;
  4. 多線程編程中的任務(wù)隊列等。

總之,只要存在生產(chǎn)者和消費者之間的數(shù)據(jù)交換,就可以考慮使用生產(chǎn)者和消費者模式來實現(xiàn)。

代碼實例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <semaphore.h>

#define BUFFER_SIZE 10
#define SHM_KEY 1234

int main() {
    int shmid;
    int *shmaddr;
    int in = 0, out = 0;

    sem_t *empty, *full, *mutex;

    // 創(chuàng)建共享內(nèi)存
    shmid = shmget(SHM_KEY, BUFFER_SIZE * sizeof(int), IPC_CREAT | 0666);
    if (shmid == -1) {
        perror("shmget");
        exit(1);
    }

    // 將共享內(nèi)存附加到進程的地址空間
    shmaddr = shmat(shmid, NULL, 0);
    if (shmaddr == (int *) -1) {
        perror("shmat");
        exit(1);
    }

    // 初始化信號量
    empty = sem_open("empty", O_CREAT, 0666, BUFFER_SIZE);
    full = sem_open("full", O_CREAT, 0666, 0);
    mutex = sem_open("mutex", O_CREAT, 0666, 1);

    if (empty == SEM_FAILED || full == SEM_FAILED || mutex == SEM_FAILED) {
        perror("sem_open");
        exit(1);
    }

    // 生產(chǎn)者進程
    if (fork() == 0) {
        int item;
        while (1) {
            item = rand() % 100;  // 生產(chǎn)一個隨機數(shù)
            sem_wait(empty);      // 等待緩沖區(qū)非滿
            sem_wait(mutex);      // 互斥訪問緩沖區(qū)
            shmaddr[in] = item;   // 將 item 放入共享內(nèi)存
            in = (in + 1) % BUFFER_SIZE;
            printf("Producer produced item %d\n", item);
            sem_post(mutex);      // 釋放緩沖區(qū)
            sem_post(full);       // 增加緩沖區(qū)中的項目數(shù)
        }
    }

    // 消費者進程
    if (fork() == 0) {
        int item;
        while (1) {
            sem_wait(full);       // 等待緩沖區(qū)非空
            sem_wait(mutex);      // 互斥訪問緩沖區(qū)
            item = shmaddr[out];  // 從共享內(nèi)存中取出一個項目
            out = (out + 1) % BUFFER_SIZE;
            printf("Consumer consumed item %d\n", item);
            sem_post(mutex);      // 釋放緩沖區(qū)
            sem_post(empty);      // 增加緩沖區(qū)中的空閑位置數(shù)
        }
    }

    // 等待子進程結(jié)束
    wait(NULL);
    wait(NULL);

    // 刪除共享內(nèi)存和信號量
    shmdt(shmaddr);
    shmctl(shmid, IPC_RMID, NULL);
    sem_unlink("empty");
    sem_unlink("full");
    sem_unlink("mutex");

    return 0;
}

在該示例中,我們使用了共享內(nèi)存和信號量來實現(xiàn)生產(chǎn)者和消費者模式。首先,我們使用 shmget() 函數(shù)創(chuàng)建共享內(nèi)存,然后使用 shmat() 函數(shù)將共享內(nèi)存附加到進程的地址空間中。接著,我們使用 sem_open() 函數(shù)初始化信號量。在生產(chǎn)者進程中,當(dāng)共享內(nèi)存非滿時,生產(chǎn)者將 item 放入共享內(nèi)存,并增加 full 信號量的值;在消費者進程中,當(dāng)共享內(nèi)存非空時,消費者從共享內(nèi)存中取出一個項目,并增加 empty 信號量的值。由于信號量的特性,當(dāng)信號量的值為 0 時,調(diào)用 sem_wait() 函數(shù)的進程將被阻塞,直到信號量的值大于 0。因此,我們不需要使用 while 循環(huán)來輪詢共享內(nèi)存的狀態(tài)。最后,我們使用 shmdt() 函數(shù)將共享內(nèi)存從進程的地址空間中分離,并使用 shmctl() 函數(shù)刪除共享內(nèi)存。同時,我們使用 sem_unlink() 函數(shù)刪除信號量。文章來源地址http://www.zghlxwxcb.cn/news/detail-435618.html

到了這里,關(guān)于【設(shè)計模式】C語言使用共享內(nèi)存和信號量,完美實現(xiàn)生產(chǎn)者與消費者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【設(shè)計模式】使用 go 語言實現(xiàn)簡單工廠模式

    最近在看《大話設(shè)計模式》,這本書通過對話形式講解設(shè)計模式的使用場景,有興趣的可以去看一下。 第一篇講的是 簡單工廠模式 ,要求輸入兩個數(shù)和運算符號,得到運行結(jié)果。 這個需求不難,難就難在類要怎么設(shè)計,才能達(dá)到可復(fù)用、維護性強、可拓展和靈活性高。 運

    2024年02月05日
    瀏覽(31)
  • 【Linux】進程間通信——system V共享內(nèi)存 | 消息隊列 | 信號量

    【Linux】進程間通信——system V共享內(nèi)存 | 消息隊列 | 信號量

    共享內(nèi)存是一種在多個進程之間進行進程間通信的機制。它允許多個進程訪問相同的物理內(nèi)存區(qū)域,從而實現(xiàn)高效的數(shù)據(jù)交換和通信。 因為 進程具有獨立性(隔離性) ,內(nèi)核數(shù)據(jù)結(jié)構(gòu)包括對應(yīng)的代碼、數(shù)據(jù)與頁表都是獨立的。OS系統(tǒng)為了讓進程間進行通信,必須讓不同的進

    2024年02月15日
    瀏覽(23)
  • 【C++】Windows下共享內(nèi)存加信號量實現(xiàn)進程間同步通信

    【C++】Windows下共享內(nèi)存加信號量實現(xiàn)進程間同步通信

    目錄 一,函數(shù)清單 1.CreateFileMapping?方法 2.OpenFileMapping?方法 3.MapViewOfFile?方法 4.UnmapViewOfFile?方法 5.CreateSemaphore?方法 6.?OpenSemaphore?方法 7.WaitForSingleObject?方法 8.ReleaseSemaphore?方法 9.CloseHandle?方法 10.GetLastError?方法 二,單共享內(nèi)存單信號量-進程間單向通信 共享內(nèi)存管理文

    2024年02月08日
    瀏覽(24)
  • 設(shè)計模式之避免共享的設(shè)計模式Copy-on-Write模式

    設(shè)計模式之避免共享的設(shè)計模式Immutability(不變性)模式 設(shè)計模式之并發(fā)特定場景下的設(shè)計模式 Two-phase Termination(兩階段終止)模式 Java 里 String 在實現(xiàn) replace() 方法的時候,并沒有更改原字符串里面 value[] 數(shù)組的內(nèi)容,而是創(chuàng)建了一個新字符串,這種方法在解決不可變對象

    2024年01月21日
    瀏覽(27)
  • 設(shè)計模式之避免共享的設(shè)計模式 Thread-Specific Storage 模式

    設(shè)計模式之避免共享的設(shè)計模式Immutability(不變性)模式 設(shè)計模式之并發(fā)特定場景下的設(shè)計模式 Two-phase Termination(兩階段終止)模式 設(shè)計模式之避免共享的設(shè)計模式Copy-on-Write模式 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 Thread-Specific Storage(

    2024年01月21日
    瀏覽(22)
  • Linux之進程間通信——system V(共享內(nèi)存、消息隊列、信號量等)

    Linux之進程間通信——system V(共享內(nèi)存、消息隊列、信號量等)

    本文介紹了另一種進程間通信——system V,主要介紹了共享內(nèi)存,消息隊列、信號量,當(dāng)然消息隊列了信號量并非重點,簡單了解即可。 共享內(nèi)存 :不同的進程為了進行通信看到的同一個內(nèi)存塊,該內(nèi)存塊被稱為共享內(nèi)存。 進程具有獨立性,它的內(nèi)核數(shù)據(jù)結(jié)構(gòu)包括對應(yīng)的代

    2024年02月08日
    瀏覽(28)
  • 設(shè)計模式之【享元模式】,共享單車火起來并不是沒有原因的

    設(shè)計模式之【享元模式】,共享單車火起來并不是沒有原因的

    全網(wǎng)最全最細(xì)的【設(shè)計模式】總目錄,收藏起來慢慢啃,看完不懂砍我 享元模式(Flyweight Pattern)也叫蠅量模式,又稱為輕量級模式,是 對象池 的一種實現(xiàn)。類似于線程池,線程池可以避免不停的創(chuàng)建和銷毀多個對象,消耗性能。提供了減少對象數(shù)量從而改善應(yīng)用所需的對

    2024年02月05日
    瀏覽(18)
  • C++11并發(fā)與多線程筆記(7) 單例設(shè)計模式共享數(shù)據(jù)分析、解決,call_once

    程序靈活,維護起來可能方便,用設(shè)計模式理念寫出來的代碼很晦澀,但是別人接管、閱讀代碼都會很痛苦 老外應(yīng)付特別大的項目時,把項目的開發(fā)經(jīng)驗、模塊劃分經(jīng)驗,總結(jié)整理成設(shè)計模式 中國零幾年設(shè)計模式剛開始火時,總喜歡拿一個設(shè)計模式往上套,導(dǎo)致一個小小的

    2024年02月12日
    瀏覽(23)
  • 【轉(zhuǎn)存】Go語言設(shè)計模式

    【轉(zhuǎn)存】Go語言設(shè)計模式

    導(dǎo)語| 設(shè)計模式是針對軟件設(shè)計中常見問題的工具箱,其中的工具就是各種經(jīng)過實踐驗證的解決方案。即使你從未遇到過這些問題,了解模式仍然非常有用,因為它能指導(dǎo)你如何使用面向?qū)ο蟮脑O(shè)計原則來解決各種問題,提高開發(fā)效率,降低開發(fā)成本;本文囊括了GO語言實現(xiàn)的

    2024年02月03日
    瀏覽(21)
  • 基于C語言的面向?qū)ο笤O(shè)計模式(持續(xù)更新)

    首先這篇文章只是初步的嘗試,不涉及過于高深的編程技巧;同時需要表明的是, 面向?qū)ο笾皇且环N思想 ,不局限于什么樣的編程語言,不可否認(rèn)的是基于面向?qū)ο筇匦远O(shè)計的語言確實要比面向過程式的語言更加容易進行抽象和統(tǒng)籌,可以說面向?qū)ο蟮脑O(shè)計模式可以很大

    2024年04月10日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包