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

歡迎訪問 生活随笔!

生活随笔

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

linux

在Linux系统下生产者消费者,生产者-消费者问题实现 (linux下C语言)

發布時間:2025/3/15 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Linux系统下生产者消费者,生产者-消费者问题实现 (linux下C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

操作系統的一個經典問題是"生產者-消費者"問題, 這涉及同步信號量和互斥信號量的應用, 在這里,我用線程的同步和互斥來實現.

/*

* author 張文

* 2008/06/20

*/

#include #include #include #include #include

#define N 2?? // 消費者或者生產者的數目

#define M 10 // 緩沖數目

int in = 0;??// 生產者放置產品的位置int out = 0; // 消費者取產品的位置

int buff[M] = {0}; // 緩沖初始化為0, 開始時沒有產品

sem_t empty_sem; // 同步信號量, 當滿了時阻止生產者放產品sem_t full_sem;?? // 同步信號量, 當沒產品時阻止消費者消費pthread_mutex_t mutex;// 互斥信號量, 一次只有一個線程訪問緩沖

int product_id = 0;?? //生產者idint prochase_id = 0; //消費者id

/* 打印緩沖情況 */

void print()

{

int i;

for(i = 0; i < M; i++)

printf("%d ", buff[i]);

printf("\n");

}

/* 生產者方法 */

void *product()

{

int id = ++product_id;

while(1)

{

// 用sleep的數量可以調節生產和消費的速度,便于觀察?? sleep(1);

//sleep(1);

sem_wait(&empty_sem);

pthread_mutex_lock(&mutex);

in = in % M;

printf("product%d in %d. like: \t", id, in);

buff[in] = 1;

print();

++in;

pthread_mutex_unlock(&mutex);

sem_post(&full_sem);

}

}

/* 消費者方法 */

void *prochase()

{

int id = ++prochase_id;

while(1)

{

// 用sleep的數量可以調節生產和消費的速度,便于觀察

sleep(1);

//sleep(1);

sem_wait(&full_sem);

pthread_mutex_lock(&mutex);

out = out % M;

printf("prochase%d in %d. like: \t", id, out);

buff[out] = 0;

print();

++out;

pthread_mutex_unlock(&mutex);

sem_post(&empty_sem);

}

}

int main()

{

pthread_t id1[N];

pthread_t id2[N];

int i;

int ret[N];

// 初始化同步信號量

int ini1 = sem_init(&empty_sem, 0, M);

int ini2 = sem_init(&full_sem, 0, 0);

if(ini1 && ini2 != 0)

{

printf("sem init failed \n");

exit(1);

}

//初始化互斥信號量int ini3 = pthread_mutex_init(&mutex, NULL);

if(ini3 != 0)

{

printf("mutex init failed \n");

exit(1);

}

// 創建N個生產者線程for(i = 0; i < N; i++)

{

ret[i] = pthread_create(&id1[i], NULL, product, (void *)(&i));

if(ret[i] != 0)

{

printf("product%d creation failed \n", i);

exit(1);

}

}

//創建N個消費者線程for(i = 0; i < N; i++)

{

ret[i] = pthread_create(&id2[i], NULL, prochase, NULL);

if(ret[i] != 0)

{

printf("prochase%d creation failed \n", i);

exit(1);

}

}

//銷毀線程for(i = 0; i < N; i++)

{

pthread_join(id1[i],NULL);

pthread_join(id2[i],NULL);

}

exit(0);

}

關于這個程序中的同步和互斥操作,很多網上資料都說必須先同步再互斥,否則會有死鎖,我認為這是錯的。事實上,生產者中先同步再互斥,而消費者先互斥再同

步,或反之;以及生產者和消費者都先互斥再同步這幾種情況都不會死鎖,因為它們間并沒有交叉關系,就更不可能形成死鎖環。之所以先同步,再互斥,是為了更

好的并發性:并發性的瓶頸是互斥區,先同步再互斥,使得互斥區代碼更短。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的在Linux系统下生产者消费者,生产者-消费者问题实现 (linux下C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

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