千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"C语言并发编程模型实例分析",在日常操作中,相信很多人在C语言并发编程模型实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C语言并发编程模型实例
千家信息网最后更新 2026年11月02日C语言并发编程模型实例分析

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

1、按照指定的顺序输出

我们执行两个线程:foo1和foo2

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 #include #include typedef struct sbuf{    int *buf;               /*堆上开辟的内存,用于存储*/    int n;                  /*cap of the buf*/    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(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语言并发编程模型实例分析"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

读者 生产 线程 顺序 实例 模型 生产者 实例分析 语言 分析 编程 学习 消费 阻塞 信号 只有 时候 消费者 信号量 保证 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网中国科技 凡科互联网科技 银优互联网科技有限公司 互联网科技缩写 丰台科技园 互联网公司 上海电发互联网科技有限公司 深圳市运趣互联网科技有限公司 团飞科技与伯堂互联网服务平台 互联网金融科技公司干啥的 崇明区互联网教育科技售后服务 互联网科技研发水平 翼展科技 首家互联网医院 科技互联网的核心竞争力 电子商务与互联网科技的关系 梅州GM互联网络科技有限公司 互联网科技股为什么大涨 互联网科技接地气 互联网科技手机排行榜 互联网领先科技活动 亚光科技低轨卫星互联网 远拓互联网科技 亿账通互联网科技 互联网科技公司介绍 玖二柒互联网科技公司待遇 宁波青枫互联网科技有限公司 银川新华互联网科技职业技术培训学校图片 佛山市翊博互联网络科技有限公司 滨湖区互联网智能科技产品有哪些 黑云互联网科技有限公司 美国五大互联网科技公司市值多少
0