在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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 分段函数,transca
- 下一篇: linux bash文件,linux之b