当前位置: 首页 > news >正文

买到域名怎么做网站爱奇艺网站建设费

买到域名怎么做网站,爱奇艺网站建设费,手机在线制作图片加字,苏州做网站好的在学习完线程相关的概念之后#xff0c;本节来认识一下Linux多线程相关的一个重要模型----“ 生产者消费者模型” 本文参考#xff1a; Linux多线程生产者与消费者_红娃子的博客-CSDN博客 Linux多线程——生产者消费者模型_linux多线程生产者与消费者_两片空白的博客-CSDN博客…在学习完线程相关的概念之后本节来认识一下Linux多线程相关的一个重要模型----“ 生产者消费者模型” 本文参考 Linux多线程生产者与消费者_红娃子的博客-CSDN博客 Linux多线程——生产者消费者模型_linux多线程生产者与消费者_两片空白的博客-CSDN博客 数据结构“入门”—队列(C语言实现_队列c语言_Fan~Fan的博客-CSDN博客  生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C 版本, 从理论到实现 (一文足以)_阻塞队列实现生产者消费者模式_小杰312的博客-CSDN博客 生产者与消费者的概念 这个模型的答题逻辑可以使用信号量POSIX信号量或 互斥量条件变量 实现这里介绍使用互斥量条件变量的方法。 一个进程中的线程有两种角色一种是生产者一种是消费者。生产者为消费者提供任务消费者拿到任务解决任务。 在生成者和消费者之间还有一个交易场所是一个内存块。生成者线程将任务放到内存块中消费者线程在内存块中拿任务。当内存块数据达到一高水位线时生产者会进行等待唤醒消费者拿任务当内存块数据达到一低水位线时消费者会等待并且唤醒生产者生产任务。条件变量通过这个模型可以解除生产者和消费者的强耦合问题。 生成者消费者存在着3种关系。生产者和生产者之间是互斥的关系消费者和消费者之间是互斥的关系生产者和消费者之间是互斥和同步的关系。 对于生产者 对于消费者 关键的问题在于生产者和消费者什么时候睡眠又什么时候被唤醒从哪里读取和写入这就是生产者和消费者模型的关键。 什么时候睡眠和唤醒在上图已经演示从哪里读取和写入的答案应该是“队列”。 所以生产者和消费者不直接相互通信而是通过队列队列就是这个模型可以解耦的关键。 C语言的队列  既然要学习队列就要先学习C语言的队列相关知识 队列的概念 只允许在一端进行插入数据操作在另一端进行删除数据操作的特殊线性表队列具有先进先出FIFO的属性。入队是从队尾添加数据出队是从队头读取数据。 队列的实现  队列的实现可以使用数组或者是链表结构相对而言链表的结构更优一些。 使用阻塞队列来实现生产者消费者的模型 在多线程编程中阻塞队列是一种常用于实现生产者和消费者模型的数据结构。其普通队列区别在于当队列为空时从队列获取元素的操作将会被阻塞直到队列中被放入元素当队列满的时候往队列中存放元素的操作也会被阻塞直到有元素从队列中取出。 队列的形式并不重要这里采用环形队列 实现思路 生产者和生产者之间互斥消费者和消费者之间互斥 在生产和消费的时候需要定义两个互斥量一个是生产者之间的一个是消费者之间的。 生产者和消费者之间互斥且同步 定义一个互斥量取数据的时候不能放放数据的时候不能取有两个条件满和空定义两个条件变量 代码展示认真看注释 #include stdio.h #include sys/types.h #include unistd.h #include stdlib.h #include pthread.h #include signal.h//定义阻塞队列 typedef struct BlockQueue { //使用了typedef给结构体起了一个别名“BlockQueue”size_t cap;//容量size_t size;//当前产品个数int front;//队头游标int tail;//队尾游标int* data; //数据域创建了一个数据类型为int的数组data指向数组头的地址pthread_mutex_t lock;pthread_cond_t full;pthread_cond_t free; } BlockQueue;BlockQueue* bqp;//定义全局方便信号处理时候销毁 //如果没有使用typedef,此处就应该为“struct BlockQueue *bqp;” //此处定义指针的原因是接下来有很多函数会修改结构体的参数如果直接传结构体作为形参那么修改的就是局部变量只有传入指向结构体的指针才能方便的直接在函数内修改结构体参数void DestroyBlockQueue(BlockQueue* bqp) { //销毁队列free(bqp-data); //释放分配给指针的空间防止资源无效占用pthread_mutex_destroy(bqp-lock);pthread_cond_destroy(bqp-full);pthread_cond_destroy(bqp-free); }void handler(int signo) { //自定义的信号处理函数详见main的signal函数printf(ByeBye\n);DestroyBlockQueue(bqp);exit(EXIT_SUCCESS); }BlockQueue* InitQueue(int n) { //初始化阻塞队列BlockQueue* bqp (BlockQueue*)malloc(sizeof(BlockQueue)); //使用malloc分配空间bqp-cap n; //容量为nbqp-size 0; //当前产品个数为0bqp-front bqp-tail 0; //由于现在没有产品所以队头和队尾的游标都是0bqp-data (int*)malloc(sizeof(int) * n); //给指向数据的指针分配空间大小是“容量” 乘以 “int型变量大小”pthread_mutex_init(bqp-lock, NULL); //初始化互斥量pthread_cond_init(bqp-free, NULL); //初始化代表“队列为空”的条件变量pthread_cond_init(bqp-full, NULL);//初始化代表“队列已满”的条件变量return bqp; //返回指向结构体的指针 }int IsEmpty(BlockQueue* bqp) {//判断阻塞队列是否为空的函数return bqp-size 0; //返回值如果是1则代表容量是0队列空反之代表队列容量不为0队列非空 }int IsFull(BlockQueue* bqp) {//判断阻塞队列是否已满的函数return bqp-size bqp-cap; //返回值如果是1则代表当前产品个数容量队列满反之代表队列未满 }void WaitConsume(BlockQueue* bqp) {//消费被阻塞, 此时队列为空等待队列有产品pthread_cond_wait(bqp-full, bqp-lock); }void WaitProduct(BlockQueue* bqp) {//生产被阻塞, 此时队列已满等待队列有空位pthread_cond_wait(bqp-free, bqp-lock); }void NotifyConsume(BlockQueue* bqp) {//通知消费, 队列中有产品了pthread_cond_signal(bqp-full); }void NotifyProduct(BlockQueue* bqp) {//通知生产, 队列中有空位了pthread_cond_signal(bqp-free); }void Lock(BlockQueue* bqp) { //上锁pthread_mutex_lock(bqp-lock); }void Unlock(BlockQueue* bqp) { //解锁pthread_mutex_unlock(bqp-lock);}void Push(BlockQueue* bqp, int val) { //向队列中增加数据的函数即生产的函数Lock(bqp);//上锁while (IsFull(bqp)) { //当队列已满的时候不断执行以下代码直到队列有空位出现WaitProduct(bqp);//生产被阻塞, 此时队列已满等待队列有空位NotifyConsume(bqp);//不断催促消费这样才可以使得队列有空位从而跳出循环}bqp-data[bqp-tail] val;//在data数组的尾部增加一个元素并把队尾游标加一bqp-tail % bqp-cap;//bqp-tail bqp-tail % bqp-cap如果队尾的游标大小没到容量大小就保持不变超出则取余//目的就是让队尾游标数值在超出容量数值的时候归0重新覆盖写//Unlock(bqp);//解锁bqp-size 1;//当前产品数量加一NotifyConsume(bqp);//有产品了通知消费Unlock(bqp);//解锁 }void Pop(BlockQueue* bqp, int* popval) { //从队列中取出数据的函数即消费的函数Lock(bqp);//上锁while (IsEmpty(bqp)) { //当队列为空的时候不断执行以下代码直到队列不为空WaitConsume(bqp);//消费被阻塞, 此时队列为空等待队列有产品NotifyProduct(bqp);//不断催促生产这样才可以使得队列有产品非空从而跳出循环}*popval bqp-data[bqp-front];//从data数组的头部读取一个消息并把队头游标加一bqp-front % bqp-cap; //bqp-front bqp-front % bqp-cap如果队头的游标大小没到容量大小就保持不变超出则取余//目的就是让队头游标数值在超出容量数值的时候归0从头重新读//Unlock(bqp);//解锁bqp-size - 1;//当前产品数量减一NotifyProduct(bqp);//有空位了通知生产Unlock(bqp);//解锁 }void* ConsumeRoutine(void* args) {//消费者线程执行函数所有消费者共用这个函数BlockQueue* bqp (BlockQueue*)args; //此时的线程参数是一个包装好的结构体在代码头已定义int popval 0;for ( ;; ) { //相当于一个while(1)Pop(bqp, popval);//消费的函数消费一个队头的数据printf(PopVal is %d, and has %ld Products\n, popval, bqp-size); //bqp结构体中的size成员的类型是size_t在系统中对size_t的定义是无符号长整形要用%ld表示sleep(rand() % 3);//rand() % 3代表随机取一个0~2的整数即随机睡眠0~2秒随机数种子在main中定义}return (void*)0; }void* ProductRoutine(void* args) {//生产者线程执行函数所有生产者共用这个函数BlockQueue* bqp (BlockQueue*)args;int pushval 0;for ( ;; ) { //相当于一个while(1)pushval rand() % 1024;//准备放入队列的数据产品, 是一个0~1023的随机整数随机数种子在main中定义Push(bqp, pushval);//生产的函数将一个产品塞入队尾生产一个产品printf(PushVal is %d, and has %ld Products\n, pushval, bqp-size); //bqp结构体中的size成员的类型是size_t在系统中对size_t的定义是无符号长整形要用%ld表示sleep(rand() % 3); //rand() % 3代表随机取一个0~2的整数即随机睡眠0~2秒随机数种子在main中定义}return (void*)0; }int main() {signal(SIGINT, handler);//当键盘输入“CTRLC”时触发SIGINT信号跳转到自定义的handler函数信号相关概念srand((unsigned int)time(NULL)); //使用“(unsigned int)time(NULL)”作为生成随机数的种子bqp InitQueue(30); //初始化并赋值给结构体bqp设定容量为30pthread_t consume1, consume2, product1, product2; //定义并创建4个线程pthread_create(product1, NULL, ProductRoutine, (void*)bqp);//2个生产者使用生产者共用函数作为启动函数pthread_create(product2, NULL, ProductRoutine, (void*)bqp);pthread_create(consume1, NULL, ConsumeRoutine, (void*)bqp);//2个消费者使用消费者共用函数作为启动函数pthread_create(consume2, NULL, ConsumeRoutine, (void*)bqp);pthread_join(product1, NULL);//4个线程等待退出pthread_join(product2, NULL);pthread_join(consume1, NULL);pthread_join(consume2, NULL);return 0; } 运行效果
http://www.zqtcl.cn/news/372602/

相关文章:

  • 提卡网站建设西安成品网站建设
  • 广州做餐饮的招聘网站买毕业设计的网站
  • 涡阳网站建设网站开发工程师项目经验
  • 手机网站建站系统成都如何做网站
  • 安徽省住房和建设执业资格注册中心网站优质公司网站
  • 深圳福田做网站公司cname解析对网站影响
  • 做个网站要多久网站制作文案
  • 用户搭建网站wordpress代码实现头像
  • 和平区网站建设app和手机网站
  • 腾讯科技微信小程序电商seo是什么意思啊
  • 手机网站模板更换方法新闻客户端网站开发
  • 湛江定制建站黄页推广app软件
  • 盈利型网站做安卓app用什么软件
  • wordpress优秀移动站点西宁公司网站建设
  • 浙江网站建设的要求建设网上商城网站的目的和意义
  • 西峰住房和城乡建设局网站关于校园网站升级建设的报告
  • 网站怎么自适应屏幕大小达人室内设计网app
  • 做网站的软件名字全拼wordpress面包屑文字大小如何调整
  • 如何建设软件下载网站北京网站建设出名 乐云践新
  • 网站seo外包南宁网站建设活动
  • 汽车行业网站设计做互联网公司网站谈单模拟视频教学
  • 做网站界面设计注意什么江苏宿迁房产网
  • 传奇服务器网站如何建设帮人做兼职的网站
  • 织梦手机网站有广告位wordpress媒体库现实不全
  • 网站建设外包公司怎么样珠海网站排名提升
  • 电子商务网站建设结业论文做网站的图片字虚
  • 米拓建站最新进展注册做网站的公司有哪些
  • 设计网站设计wordpress 改系统
  • 学校网站建设评审会议通知网站是怎么赢利的
  • 手机网站建设 苏州优化网站哪个好