关于linux c语言多线程编程的问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

关于linux c语言多线程编程的问题

2016-07-15 14:39:32 2162 2

/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你
生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。
缓冲区有N个,是一个环形的缓冲池。

*/
#include 
#include
#define BUFFER_SIZE 16
struct prodcons
{
int buffer[BUFFER_SIZE];/*实际存放数据的数组*/
pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/
int readpos,writepos; /*读写指针*/
pthread_cond_t notempty;/*缓冲区非空的条件变量*/
pthread_cond_t notfull;/*缓冲区未满 的条件变量*/
};
/*初始化缓冲区*/
void pthread_init( struct prodcons *p)
{
pthread_mutex_init(&p->lock,NULL);
pthread_cond_init(&p->notempty,NULL);
pthread_cond_init(&p->notfull,NULL);
p->readpos = 0;
p->writepos = 0;
}
/*将产品放入缓冲区,这里是存入一个整数*/
void put(struct prodcons p,int data)
{
pthread_mutex_lock(&p->lock);
/等待缓冲区未满*/
if((p->writepos +1)%BUFFER_SIZE ==p->readpos)
{
pthread_cond_wait(&p->notfull,&p->lock);
}
p->buffer[p->writepos] =data;
p->writepos++;
if(p->writepos >= BUFFER_SIZE)
p->writepos = 0;
pthread_cond_signal(&p->notempty);
pthread_mutex_unlock(&p->lock);
}
/*从缓冲区取出整数*/
int get(struct prodcons p)
{
int data;
pthread_mutex_lock(&p->lock);
/等待缓冲区非空*/
if(p->writepos == p->readpos)
{
pthread_cond_wait(&p->notempty ,&p->lock);//非空就设置条件变量notempty
}
/*读书据,移动读指针*/
data = p->buffer[p->readpos];
p->readpos++;
if(p->readpos == BUFFER_SIZE)
p->readpos = 0;
/*设置缓冲区未满的条件变量*/
pthread_cond_signal(&p->notfull);
pthread_mutex_unlock(&p->lock);
return data;
}
/*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/
#define OVER (-1)
struct prodcons buffer;
void producer(void *data)
{
int n;
for( n=0;n {
printf("%d ------>\n",n);
put(&buffer,n);
}
put(&buffer,OVER);
return NULL;
}
void *consumer(void *data)
{
int d;
while(1)
{
d = get(&buffer);
if(d == OVER)
break;
else
printf("----->%d\n",d);
}
return NULL;
}
int main()
{
pthread_t th_p,th_c;
void *retval;
pthread_init(&buffer);
pthread_create(&th_p,NULL,producer,0);
pthread_create(&th_c,NULL,consumer,0);
/等待两个线程结束*/
pthread_join(th_p, &retval);
pthread_join(th_c,&retval);
return 0;
}

这段代码是我从网上下载的代码
问题是
main函数中没有声明结构体变量
也没有全局结构体变量
那么main函数为什么可以直接使用buffer

取消 提交回答
全部回答(2)
  • 游客c732br6umetys
    2019-11-12 20:31:11

    有声明啊,搜索struct prodcons buffer; 啊兄弟

    0 0
  • 杨冬芳
    2019-07-17 19:56:57

    linux 下c语言 多线程编程
    Linux 多线程编程问题

    0 0
添加回答
相关问答

1

回答

linux c语言学习

2016-06-15 09:17:51 2260浏览量 回答数 1

1

回答

linux中设定文本行长度的命令是什么?

2021-12-03 00:50:06 144浏览量 回答数 1

1

回答

linux中简单的文本格式化工具的命令是什么?

2021-12-03 00:52:24 129浏览量 回答数 1

1

回答

linux中命令pr是什么意思?

2021-12-03 00:53:09 152浏览量 回答数 1

1

回答

linux中格式化打印文本的命令是什么?

2021-12-03 00:53:44 138浏览量 回答数 1

1

回答

linux中命令printf是什么意思?

2021-12-03 00:54:13 124浏览量 回答数 1

1

回答

linux中格式化并打印数据的命令是什么?

2021-12-03 00:54:44 173浏览量 回答数 1

1

回答

linux中命令lpstat是什么意思?

2021-12-03 00:55:22 126浏览量 回答数 1

1

回答

linux中显示打印状态信息的命令是什么?

2021-12-03 00:55:56 147浏览量 回答数 1

1

回答

linux中命令lpq是什么意思?

2021-12-03 00:56:30 180浏览量 回答数 1
+关注
杨冬芳
IT从业
文章
问答
问答排行榜
最热
最新
相关电子书
更多
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
Decian GNU/Linux安全合规之路
立即下载
ECS系统指南之Linux系统诊断
立即下载