Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Terjemahan masalah pengeluar-pengguna dalam bahasa C

Terjemahan masalah pengeluar-pengguna dalam bahasa C

王林
王林ke hadapan
2023-09-09 08:17:04648semak imbas

Terjemahan masalah pengeluar-pengguna dalam bahasa C

Dalam pengaturcaraan serentak, concurrency mewakili konsep utama yang diperlukan untuk memahami sepenuhnya cara sistem ini berfungsi. Di antara pelbagai cabaran yang dihadapi oleh pengamal yang bekerja dengan sistem ini, masalah pengeluar-pengguna adalah salah satu masalah penyegerakan yang paling terkenal. Dalam artikel ini, kami berhasrat untuk menganalisis topik ini dan menyerlahkan kepentingannya untuk pengkomputeran serentak, sambil turut meneroka kemungkinan penyelesaian berasaskan C.

Terjemahan bahasa Cina bagi

Pengenalan

ialah:

Pengenalan

Dalam sistem serentak, berbilang urutan atau proses boleh mengakses sumber dikongsi pada masa yang sama. Masalah pengeluar-pengguna melibatkan dua entiti: pengeluar menjana data atau tugas, dan pengguna memproses atau menggunakan data yang dijana. Cabarannya adalah untuk memastikan pengeluar dan pengguna menyegerakkan aktiviti mereka untuk mengelakkan masalah seperti keadaan kaum atau konflik sumber.

Memahami isu pengeluar-pengguna

Pernyataan Masalah

Satu takrifan yang mungkin bagi masalah pengeluar-pengguna melibatkan dua kumpulan utama: pengeluar data menyimpan kerja mereka dalam ruang kongsi yang dipanggil penimbal dan pemproses (pengguna) menggunakan kandungan ruang yang disimpan. Individu ini menggunakan kepakaran mereka dalam mengumpulkan item dalam senario storan sementara ini, menganalisisnya secara menyeluruh, dan kemudian memberikan hasil yang bernas.

Keperluan Penyegerakan

Menyelesaikan dilema pengeluar-pengguna semestinya melibatkan pelaksanaan teknologi kerjasama yang disegerakkan di kalangan pelbagai pihak berkepentingan. Mengoptimumkan penyepaduan protokol penyegerakan adalah penting untuk mengelakkan penimbal peranti dibebankan dengan menghasilkan unit atau keletihan oleh unit yang digunakan.

Melaksanakan masalah pengeluar-pengguna dalam bahasa C

Penimbal dikongsi

Dalam bahasa C, anda boleh menggunakan struktur data tatasusunan atau baris gilir untuk melaksanakan penimbal dikongsi. Penampan hendaklah mempunyai saiz tetap dan operasi sokongan seperti menambah data (pengeluar) dan mendapatkan semula data (pengguna).

Teknologi Penyegerakan

Pelbagai teknik penyegerakan boleh digunakan untuk menyelesaikan masalah pengeluar-pengguna dalam bahasa C, termasuk

  • Kunci Mutex dan pembolehubah keadaan − Kunci Mutex menyediakan perlindungan pengecualian bersama untuk bahagian kritikal kod, manakala pembolehubah keadaan membenarkan benang menunggu sehingga syarat tertentu dipenuhi.

  • Semaphore - Semaphore boleh mengawal akses kepada penimbal kongsi dengan menjejaki bilangan slot kosong dan penuh.

  • Monitor − Monitor menyediakan abstraksi peringkat lebih tinggi untuk penyegerakan dan merangkum data kongsi serta operasi yang boleh dilakukan padanya.

Penyelesaian kepada masalah pengeluar-pengguna dalam C

Penyelesaian Penampan Terhad

Penyelesaian biasa kepada masalah pengeluar-pengguna ialah penyelesaian penimbal terhad. Ia melibatkan penggunaan penimbal bersaiz tetap dengan mekanisme penyegerakan untuk memastikan pengeluar dan pengguna bekerjasama dengan betul. Kapasiti pengeluaran projek dihadkan oleh saiz penimbal, jadi perancangan mesti mengambil kira spesifikasi ini untuk mengelakkan melebihi ruang yang tersedia dalam penimbal.

pengeluar dan benang pengguna

Dalam bahasa C, aktiviti pengeluar dan pengguna boleh dilaksanakan sebagai benang yang berasingan. Setiap utas pengeluar menjana data dan menambahkannya pada penimbal dikongsi, manakala setiap utas pengguna mendapatkan semula data daripada penimbal dan memprosesnya. Mekanisme penyegerakan digunakan untuk menyelaraskan aktiviti benang.

Mengendalikan kes tepi

Dalam senario dunia sebenar, faktor tambahan mungkin perlu dipertimbangkan. Contohnya, jika pengeluar menjana data pada kadar yang lebih pantas daripada pengguna boleh memprosesnya, anda mungkin perlu menggunakan mekanisme penimbalan seperti menyekat atau membuang data untuk mengelakkan kehilangan data atau situasi kebuntuan.

Dua contoh kod yang ditulis dalam bahasa C untuk menggambarkan pelaksanaan masalah pengeluar-pengguna

Penyelesaian penimbal terikat menggunakan mutex dan pembolehubah keadaan, dengan keadaan penamat.

Terjemahan bahasa Cina bagi

Contoh

ialah:

Contoh

#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;
}

Dalam contoh ini, penyelesaian penimbal terhad kepada masalah pengeluar-pengguna dilaksanakan menggunakan kunci mutex dan pembolehubah keadaan. Urutan pengeluar menjana item dan menambahkannya pada penimbal, manakala utas pengguna mendapatkan dan menggunakan item daripada penimbal. Mutex memastikan eksklusiviti bersama apabila mengakses penimbal, dan pembolehubah keadaan (penuh dan kosong) menyelaraskan rangkaian pengeluar dan pengguna. Menambahkan syarat penamatan untuk mengehadkan bilangan item yang dijana dan digunakan.

Output

Produced: 1
Produced: 2
Produced: 3
Produced: 4
Consumed: 1
Consumed: 2
Consumed: 3
Consumed: 4
Produced: 5
Consumed: 5

Penyelesaian penimbal terikat menggunakan semafor dan syarat penamatan

Terjemahan bahasa Cina bagi

Contoh

ialah:

Contoh

#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;
}

Dalam contoh ini, penyelesaian penimbal terhad kepada masalah pengeluar-pengguna dilaksanakan menggunakan semafor. Semaphore digunakan untuk mengawal akses kepada penimbal dan menyegerakkan benang pengeluar dan pengguna. Semaphore Mutex memastikan akses yang saling eksklusif, semaphore penuh menjejaki bilangan item dalam penimbal, dan semafor kosong menjejaki bilangan slot kosong yang tersedia. Menambah syarat penamatan untuk mengehadkan bilangan item yang dihasilkan dan digunakan.

输出

Produced: 1
Consumed: 1
Produced: 2
Consumed: 2
Produced: 3
Consumed: 3
Produced: 4
Consumed: 4
Produced: 5
Consumed: 5

结论

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

Atas ialah kandungan terperinci Terjemahan masalah pengeluar-pengguna dalam bahasa C. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam