我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言并发编程模型实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言并发编程模型实例分析

这篇文章主要介绍“C语言并发编程模型实例分析”,在日常操作中,相信很多人在C语言并发编程模型实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言并发编程模型实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、按照指定的顺序输出

我们执行两个线程:foo1foo2

foo1:打印step1, step3

foo2:打印step2

请用并发使得按照1 2 3 的顺序输出

答:首先两个线程执行顺序不可预判,我们必须保证打印step2之前step1就打印好了,因此需要阻塞一下step2,实现的方式是初始化sem为0,只有打印完step1后(然后进行解锁,V操作)step2才能执行

同理,只有打印完step2后才解开阻塞step3的锁,具体看代码实现就明白了

#include "csapp.c"sem_t step1_done, step2_done;void*  foo1() {    printf("test1 is done\n");    V(&step1_done);                  //step1执行完毕了,那么foo2的阻塞就会被解开    P(&step2_done);                  //测试是否step2执行完毕,    printf("test3 is done\n");    return NULL;}void* foo2() {    P(&step1_done);    printf("test2 is done\n");    V(&step2_done);                  //step2执行完毕,解开打印step的锁    return NULL;}int main(){    pthread_t tid1, tid2;    Sem_init(&step1_done, 0, 0);            //第二个参数为0:在线程之间进行, 第三个参数初始化都为零    Sem_init(&step2_done, 0, 0);    Pthread_create(&tid1, NULL, foo1, NULL);    Pthread_create(&tid2, NULL, foo2, NULL);    //保证线程执行完毕之后主线程才退出,否则线程都执行不了了    Pthread_join(tid1, NULL);    Pthread_join(tid2, NULL);    exit(0);}

2、生产者消费者模型

主要的就是在生产和消费函数中对于信号量的处理

错误实例:

void sbuf_insert(subf_t* sp, int item) {    sem_wait(&sp->mutex);  sem_wait(&sp->slots);    //将项目放进buf中    sp->buf[(++sp->rear) % (sp->n)] = item;    sem_post(&sp->items);    sem_post(&sp->mutex);}void sbuf_remove(sbuf_t* sp) {  sem_wait(&sp->mutex);  sem_wait(&sp->items);      //do works    sem_post(&sp->slots);  sem_post(&sp->mutex);}

如果我们在处理的时候先拿到 互斥锁,可能就会引起死锁

假设现在buf是满的,生产者拿到了互斥锁,但是自己因为没有空闲被 block…

此时消费者同样因为拿不到互斥锁而被 block…

其他的生产者同样也是没有 互斥锁被block…

解决方法:

比较简单,调换一下顺序就好了。相当于我们生产者、消费者在进行的时候 明确我到底要操控哪个格子 然后再拿mutex????

#include <stdio.h>#include <stdlib.h>#include <semaphore.h>typedef struct sbuf{    int *buf;                   int n;                      int front;              //第一个item    int rear;               //最后一个item    sem_t mutex;            //获取临界区的锁    sem_t slots;            //空槽数目    sem_t items;            //已经生产了的数目}subf_t;void sbuf_init(subf_t* sp, int n) {    sp->n     = n;    sp->buf   = static_cast<int *>(calloc(n, sizeof(int)));    sp->front = 0;    sp->rear  = 0;    sem_init(&sp->mutex, 0, 1);    sem_init(&sp->slots, 0, n);    sem_init(&sp->items, 0, 0);}void sbuf_deinit(subf_t*sp) {    free(sp->buf);}void sbuf_insert(subf_t* sp, int item) {    //首先应该对信号量slots判断,你生产者看中    sem_wait(&sp->slots);    sem_wait(&sp->mutex);    //将项目放进buf中    sp->buf[(++sp->rear) % (sp->n)] = item;    //CSAPP中提到,解锁的顺序一般是和加锁的顺序是相反的    sem_post(&sp->mutex);    sem_post(&sp->items);}int  sbuf_remove(subf_t* sp) {    int item;    sem_wait(&sp->items);       //我看上哪个格子的产品了    sem_wait(&sp->mutex);    item = sp->buf[(++sp->front) % (sp->n)];    sem_post(&sp->mutex);    sem_post(&sp->slots);    return item;}

3、读写锁

第一类读者、写者问题(读者优先)

  • 不会让读者进行等待的,除非现在的权限是写者的

  • 也就是说读者不会因为有一个写者在等待

实现:

信号量:w维护着对于critical section的访问, mutex维护这对于共享变量readcnt(当前在临界区的读者的数量)的访问

每当写者进入了临界区,就对w进行加锁????,离开就解锁。保证了任意时刻临界区最多只能有一个写者

只有第一个读者进入的时候对W加锁,最后一个才释放,那么只要还有一个读者在,其他任意的读者就能够无障碍的进入,同样会导致 写者饥饿

int readcnt = 0;sem_t ,mutex = 1, w = 1;void reader() {  while (1) {    P(&mutex);    readcnt++;    if (readcnt == 1) //第一个进入的读者      P(&w);//上锁,写者不能写了    V(&mutex);//解开对于readcnt的保护锁                P(&mutex);    readcnt--;    if (readcnt == 0)       V(&w);//最后一个读者了, 解开阻塞写者的锁    V(&mutex);//解开对readcnt的保护锁  }}void writer() {  while (1) {    P(&w);            V(&w);  }}

到此,关于“C语言并发编程模型实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言并发编程模型实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言并发编程模型实例分析

这篇文章主要介绍“C语言并发编程模型实例分析”,在日常操作中,相信很多人在C语言并发编程模型实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言并发编程模型实例分析”的疑惑有所帮助!接下来,请跟着小编
2023-06-30

SingleFlight模式的Go并发编程实例分析

这篇文章主要介绍了SingleFlight模式的Go并发编程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SingleFlight模式的Go并发编程实例分析文章都会有所收获,下面我们一起来看看吧。在go
2023-06-30

深入理解Go语言的并发编程:Go的并发模型解析

Go语言作为一门流行的编程语言,以其出色的并发编程能力而闻名。并发编程是在同一时间内执行多个独立的任务,通过充分利用多核处理器的性能以提高程序的性能和效率。在Go语言中,并发编程是一种非常简单、直观和高效的方式来编写并行程序。本文将深入探讨
深入理解Go语言的并发编程:Go的并发模型解析
2024-03-04

Java并发编程之volatile与JMM多线程内存模型实例分析

本篇内容主要讲解“Java并发编程之volatile与JMM多线程内存模型实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发编程之volatile与JMM多线程内存模型实例分析”
2023-06-30

C语言程序的编译与预处理实例分析

本篇内容介绍了“C语言程序的编译与预处理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!程序的翻译环境和执行环境在ANSIC的任何一种
2023-06-30

C语言分支语句实例分析

这篇文章主要介绍了C语言分支语句实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言分支语句实例分析文章都会有所收获,下面我们一起来看看吧。C语言的语句C语句可分为以下五类:1. 表达式语句2. 函数调
2023-06-30

深入解析 Go 语言 GMP 模型:并发编程的核心机制

为了解决单进程时代的效率问题,引入了多进程和多线程并发模型。在这种模型中,当一个进程阻塞时,CPU可以切换到另一个准备好的进程继续执行。这样可以充分利用CPU资源,提高系统的并发处理能力。
Go语言GMP2024-11-29

编程语言之高并发系统中限流的示例分析

这篇文章主要介绍了编程语言之高并发系统中限流的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。本文结合作者的
2023-05-30

Java之JMM高并发编程实例分析

这篇文章主要介绍“Java之JMM高并发编程实例分析”,在日常操作中,相信很多人在Java之JMM高并发编程实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java之JMM高并发编程实例分析”的疑惑有所
2023-07-02

C语言分支句实例分析

今天小编给大家分享一下C语言分支句实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。何为语句C语言中由一个分号;隔开的就
2023-06-29

汇编语言的函数式编程实例分析

这篇文章主要介绍了汇编语言的函数式编程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇汇编语言的函数式编程实例分析文章都会有所收获,下面我们一起来看看吧。一切都是为了消除副作用要了解函数式编程,我们需要首
2023-06-27

Java并发编程之线程状态实例分析

今天小编给大家分享一下Java并发编程之线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。线程状态概述线程由生到
2023-06-30

Go并发编程的示例分析

这篇文章给大家分享的是有关Go并发编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、goroutine定义给函数前加上go即可不需要在定义是区分是否是异步函数调度器在合适的点进行切换,这个点是有很多
2023-06-20

C++模板编程的示例分析

这篇文章主要为大家展示了“C++模板编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++模板编程的示例分析”这篇文章吧。模板初阶泛型编程在计算机程序设计领域,为了避免因数据类型的不
2023-06-25

C++并发编程:如何实现高效的异步编程模型?

异步编程提高了响应能力,在 c++++ 中可通过以下方式实现:协程:轻量级协作任务,使用协程库(如 folly)创建和管理。future:表示异步操作结果,使用 future 库(如 std::future)创建和管理。非阻塞模型:协程和
C++并发编程:如何实现高效的异步编程模型?
2024-05-01

C语言中程序编译系统的示例分析

这篇文章主要介绍C语言中程序编译系统的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!程序的翻译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境 :第1种是翻译环境,在这个环境中源代码被转换为可
2023-06-29

C语言结构体实例分析

这篇文章主要介绍“C语言结构体实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言结构体实例分析”文章能帮助大家解决问题。1. 动态内存管理C语言代码----->编译----->链接----
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录