首頁 > 後端開發 > C++ > 主體

生產者-消費者問題在C語言的翻譯

王林
發布: 2023-09-09 08:17:04
轉載
694 人瀏覽過

生產者-消費者問題在C語言的翻譯

在同時程式設計中,並發代表著一個關鍵概念,完全理解這些系統如何運作是必要的。在與這些系統一起工作的從業者面臨的各種挑戰中,生產者-消費者問題是最著名的同步問題之一。在本文中,我們的目標是分析這個主題,並強調它對並發計算的重要性,同時也探討了基於C的可能解決方案。

Introduction

的中文翻譯為:

介紹

#在並發系統中,多個執行緒或行程可能同時存取共享資源。生產者-消費者問題涉及兩個實體:生產者產生資料或任務,消費者處理或消費產生的資料。挑戰在於確保生產者和消費者同步它們的活動,以避免競態條件或資源衝突等問題。

理解生產者-消費者問題

問題陳述

生產者-消費者問題的一個可能定義涉及兩個主要群體:資料的生產者將其工作儲存在一個稱為緩衝區的共享空間中,而處理器(消費者)則使用該空間中保存的內容。這些人利用他們在這個臨時儲存場景中收集的項目的專業知識,全面分析它,然後提供有見地的結果。

同步要求

解決生產者-消費者困境必然涉及實施各利害關係人之間的同步協作技術。在避免設備緩衝區被生產單元過載或被消費單元耗盡的情況下,優化同步協議的整合是至關重要的。

在C語言中實現生產者-消費者問題

共享緩衝區

在C語言中,可以使用陣列或佇列資料結構來實作共享緩衝區。緩衝區應具有固定大小,並支援新增資料(生產者)和檢索資料(消費者)等操作。

同步技術

可以使用多種同步技術來解決C語言中的生產者-消費者問題,包括 

  • #互斥鎖和條件變數 − 互斥鎖提供互斥保護程式碼的關鍵部分,而條件變數允許執行緒在滿足特定條件之前等待。

  • 信號量 - 信號量可以透過追蹤空槽和滿槽的數量來控制對共享緩衝區的存取。

  • Monitors − 監視器為同步提供了更高級的抽象,並封裝了共享資料和可以對其執行的操作。

在C中解決生產者-消費者問題的解決方案

有界緩衝區解決方案

生產者-消費者問題的常見解決方案是有界緩衝區解決方案。它涉及使用具有同步機制的固定大小緩衝區,以確保生產者和消費者正確協作。專案生產的容量受到緩衝區大小的限制,因此在規劃時必須考慮此規格,以免超出緩衝區的可用空間。

生產者與消費者執行緒

在C語言中,生產者和消費者的活動可以作為單獨的執行緒來實現。每個生產者執行緒產生資料並將其新增至共享緩衝區,而每個消費者執行緒從緩衝區檢索資料並進行處理。同步機制用於協調線程的活動。

處理邊緣情況

在現實世界的場景中,可能需要考慮額外的因素。例如,如果生產者以比消費者處理速度更快的速率產生數據,可能需要使用緩衝機制,例如阻塞或丟棄數據,以防止數據遺失或死鎖情況的發生。

用C語言寫的兩個範例程式碼,用來說明生產者-消費者問題的實作

使用互斥鎖和條件變數的有界緩衝區解決方案,具有終止條件。

Example

的中文翻譯為:

範例

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define BUFFER_SIZE 5
#define MAX_ITEMS 5

int buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
int produced_count = 0;
int consumed_count = 0;

pthread_mutex_t mutex;
pthread_cond_t full;
pthread_cond_t empty;

void* producer(void* arg) {
   int item = 1;

   while (produced_count < MAX_ITEMS) {
      pthread_mutex_lock(&mutex);

      while (((in + 1) % BUFFER_SIZE) == out) {
         pthread_cond_wait(&empty, &mutex);
      }

      buffer[in] = item;
      printf("Produced: %d</p><p>", item);
      item++;
      in = (in + 1) % BUFFER_SIZE;

      produced_count++;

      pthread_cond_signal(&full);
      pthread_mutex_unlock(&mutex);
   }

   pthread_exit(NULL);
}

void* consumer(void* arg) {
   while (consumed_count < MAX_ITEMS) {
      pthread_mutex_lock(&mutex);

      while (in == out) {
         pthread_cond_wait(&full, &mutex);
      }

      int item = buffer[out];
      printf("Consumed: %d</p><p>", item);
      out = (out + 1) % BUFFER_SIZE;

      consumed_count++;

      pthread_cond_signal(&empty);
      pthread_mutex_unlock(&mutex);
   }

   pthread_exit(NULL);
}

int main() {
   pthread_t producerThread, consumerThread;

   pthread_mutex_init(&mutex, NULL);
   pthread_cond_init(&full, NULL);
   pthread_cond_init(&empty, NULL);

   pthread_create(&producerThread, NULL, producer, NULL);
   pthread_create(&consumerThread, NULL, consumer, NULL);

   pthread_join(producerThread, NULL);
   pthread_join(consumerThread, NULL);

   pthread_mutex_destroy(&mutex);
   pthread_cond_destroy(&full);
   pthread_cond_destroy(&empty);

   return 0;
}
登入後複製

在這個例子中,使用互斥鎖和條件變數實現了生產者-消費者問題的有界緩衝區解決方案。生產者執行緒產生專案並將其新增至緩衝區,而消費者執行緒則從緩衝區檢索和消費專案。互斥鎖確保在存取緩衝區時的互斥性,條件變數(full和empty)協調生產者和消費者執行緒。新增了終止條件以限制生成和消費的項目數量。

輸出

Produced: 1
Produced: 2
Produced: 3
Produced: 4
Consumed: 1
Consumed: 2
Consumed: 3
Consumed: 4
Produced: 5
Consumed: 5
登入後複製

使用信號量和終止條件的有界緩衝區解決方案

Example

的中文翻譯為:

範例

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

#define BUFFER_SIZE 5
#define MAX_ITEMS 20

int buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
int produced_count = 0;
int consumed_count = 0;

sem_t mutex;
sem_t full;
sem_t empty;

void* producer(void* arg) {
   int item = 1;

   while (produced_count < MAX_ITEMS) {
      sem_wait(&empty);
      sem_wait(&mutex);

      buffer[in] = item;
      printf("Produced: %d</p><p>", item);
      item++;
      in = (in + 1) % BUFFER_SIZE;

      produced_count++;

      sem_post(&mutex);
      sem_post(&full);
   }

   pthread_exit(NULL);
}

void* consumer(void* arg) {
   while (consumed_count < MAX_ITEMS) {
      sem_wait(&full);
      sem_wait(&mutex);

      int item = buffer[out];
      printf("Consumed: %d</p><p>", item);
      out = (out + 1) % BUFFER_SIZE;

      consumed_count++;

      sem_post(&mutex);
      sem_post(&empty);
   }

   pthread_exit(NULL);
}

int main() {
   pthread_t producerThread, consumerThread;

   sem_init(&mutex, 0, 1);
   sem_init(&full, 0, 0);
   sem_init(&empty, 0, BUFFER_SIZE);

   pthread_create(&producerThread, NULL, producer, NULL);
   pthread_create(&consumerThread, NULL, consumer, NULL);

   pthread_join(producerThread, NULL);
   pthread_join(consumerThread, NULL);

   sem_destroy(&mutex);
   sem_destroy(&full);
   sem_destroy(&empty);

   return 0;
}
登入後複製

在這個例子中,使用信號量實現了生產者-消費者問題的有界緩衝區解決方案。信號量用於控制對緩衝區的存取並同步生產者和消費者執行緒。互斥信號量確保互斥訪問,滿信號量追蹤緩衝區中的項目數量,空信號量追蹤可用的空槽位數量。增加了終止條件以限制生產和消費的項目數量。

输出

Produced: 1
Consumed: 1
Produced: 2
Consumed: 2
Produced: 3
Consumed: 3
Produced: 4
Consumed: 4
Produced: 5
Consumed: 5
登入後複製

结论

生产者-消费者问题是并发编程中的一个重要挑战。通过理解问题并采用适当的同步技术,如互斥锁、条件变量、信号量或监视器,在C编程语言中可以开发出健壮的解决方案。这些解决方案使生产者和消费者能够和谐地共同工作,在并发系统中确保高效的数据生成和消费。

以上是生產者-消費者問題在C語言的翻譯的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板