这个问题需要的知识主要包括:
1 多进程间进行通信;
2 使用同步信号量(semaphore)和互斥信号量(mutex)进行数据保护。
参考代码如下,可以参照注释辅助理解:
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#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 //生产者id
int 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)
}
在Linux下编译的时候,要在编译命令中加入选项-lpthread以包含多线程支持。比如存储的C文件为demo.c,要生成的可执行文件为demo。可以使用命令:
gcc demo.c -o demo -lpthread
程序中为便于观察,使用了sleep(1)来暂停运行,所以查看输出的时候可以看到,输出是每秒打印一次的。
sem的意思是:
1、abbr. 扫描式电子显微镜(scanning electron microscope);标准电子组件(Standard Electronic Modules)
2、n. (Sem)(泰、柬)森(人名);(Sem)(西、挪)塞姆(人名)
【读音】英 [,es i: 'em]
【短语】
1、SEM Analysis 扫描电镜分析 扫描电子显微镜分析 sem分析
2、sem image sem图像 sem图
3、sem break 空白时间
4、sem valor 无用
5、SEM WATCH 搜索引擎营销观察
6、TSINGHUA SEM 理学院 清华经管学院 清华大学经济管理学院 大学经济管理学院
扩展资料
sem的近义词
seminar
【读音】英 [ˈsemɪnɑː(r)] 美 [ˈsemɪnɑːr]
【意思】n. 讨论会,研讨班
【短语】
1、seminar course 研究学程 专题研究科目 研究科目
2、Olympic Seminar 奥运主题讲座
3、Advanced seminar 高级研讨会
4、Basic Seminar 突破性领导力基础课程 基本课程 真善美讲座
5、Business Seminar 商务研讨会
6、Joint Seminar 双边学术研讨会
#include<stdio.h>#include<stdlib.h>
#include<unistd.h>
#include<semaphore.h>
#include<pthread.h>
#define PRODUCER 10//生产者数量
#define CONSUMER 8//消费者数量
#define BUFFER 20//缓冲区数量
sem_t empty,full//同步信号量
pthread_mutex_t mutex//互斥信号量
int buffer[BUFFER] //缓冲区
int producer_id=0,consumer_id=0//生产者消费者ID
int index_in=0,index_out=0//生产者 消费者 存放 消费的位置
void print()//输出缓冲区
{
int i
printf("Buffer:\n")
for(i=0i<20i++)
{
printf("___")
}
printf("\n")
for(i=0i<20i++)
printf("|%d|",buffer[i])
printf("\n")
for(i=0i<20i++)
{
printf("———")
}
printf("\n")
}
void *Producer()//生产者函数
{
int ID=++producer_id
while(1)
{
sleep(3)
sem_wait(&empty)
pthread_mutex_lock(&mutex)
index_in=index_in%BUFFER
printf("Producer %d in %d.\n",ID,index_in)
buffer[index_in]=1//缓冲区置0
print()//输出缓冲区情况
index_in++
pthread_mutex_unlock(&mutex)
sem_post(&full)
}
}
void *Consumer()//消费者函数
{
int ID=++consumer_id
while(1)
{
sleep(3)
sem_wait(&full)
pthread_mutex_lock(&mutex)
index_out=index_out%BUFFER
printf("\033[0134mConsumer %d in %d\033[0m\n",ID,index_out)
buffer[index_out]=0//缓冲区置0
print()//输出缓冲区情况
index_out++
pthread_mutex_unlock(&mutex)
sem_post(&empty)
}
}
int main()
{
//freopen("text.txt","w",stdout)
int rthread[18],i
pthread_t producer[PRODUCER]//生产者
pthread_t consumer[CONSUMER]//消费者
int sinit1=sem_init(&empty,0,BUFFER)//初始化同步信号量
int sinit2=sem_init(&full,0,0)
int minit =pthread_mutex_init(&mutex,NULL)//初始化互斥信号量
if(sinit1 && sinit2)
{
printf("sem initialize failed /n")
exit(1)
}
if(minit)
{
printf("sem initialize failed /n")
exit(1)
}
for(i=0i<PRODUCERi++)//创建生产者线程
{
rthread[i]=pthread_create(&producer[i], NULL, Producer, NULL)
if(rthread[i])
{
printf("producer %d create failed /n", i)
exit(1)
}
}
for(i=0i<CONSUMERi++)//创建消费者线程
{
rthread[i]=pthread_create(&consumer[i], NULL, Consumer,NULL)
if(rthread[i])
{
printf("consumer %d create failed /n", i)
exit(1)
}
}
for(i=0i<PRODUCERi++)//销毁生产者线程
{
pthread_join(producer[i],NULL)
}
for(i=0i<CONSUMERi++)//销毁生产者线程
{
pthread_join(consumer[i],NULL)
}
exit(0)
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)