日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型”

發布時間:2024/9/30 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

模型中,最為關鍵的步驟是,在生產者回調函數中,未生產之前,消費者回調函數是阻塞的,阻塞方式是條件變量。
那么不使用條件變量,如何使用“信號量”實現阻塞呢?
答案是因為調用 sem_wait,當 sem == 0 時候,該線程就會阻塞。因此:生產者對應一個信號量 :sem_t produce;消費者對應一個信號量 :sem_t customer。
sem_init(&produce, 0, 2);
sem_init(&customer, 0, 0); 消費者 value = 0,表示被阻塞

// 頭文件 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <pthread.h> #include <semaphore.h> #include <time.h> sem_t produce; // 定義2個信號量 sem_t custom; typedef struct node // 定義共享變量結構體 {int data;struct node* next; }Node; Node* phead = NULL; // 頭結點置空 // 生產者回調函數 void* produce_fun() {while(1){sem_wait(&produce); // 生產者取信號量并生產Node* node = (Node*)malloc(sizeof(Node));node->data = rand() % 1000;node->next = phead;phead = node;printf("生產者:%lu, 產品:%d\n", pthread_self(), node->data);sem_post(&custom); // 給消費者信號量sleep(1);}return NULL; } // 消費者回調函數 void* custom_fun() {while(1){sem_wait(&custom); // 剛開始消費者阻塞,直至生產者給消費者信號量后,解除阻塞Node* del = phead; // 記錄待刪除頭結點的位置phead = phead->next; // 更新刪除后新頭結點printf("消費者: %lu, 消費: %d\n", pthread_self(), del->data);free(del); // 刪除頭結點sem_post(&produce); // 歸還信號量,回復阻塞狀態sleep(1);}return NULL; } int main() {srand(time(NULL));// 初始化信號量sem_init(&produce, 0, 2);sem_init(&custom, 0, 0);// 創建線程pthread_t p1, p2;pthread_create(&p1, NULL, produce_fun, NULL);pthread_create(&p2, NULL, custom_fun, NULL);// 回收子線程pthread_join(p1, NULL);pthread_join(p2, NULL);// 銷毀信號量sem_destroy(&produce);sem_destroy(&custom);return 0; }

總結

以上是生活随笔為你收集整理的Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型”的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。