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

网站生成器下载nba最新交易信息

网站生成器下载,nba最新交易信息,深圳市住房和城乡建设部网站,深圳网站导航🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux
菜鸟刷题集

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

文章目录

    • 前言
    • 1 POSIX信号量相关概念
    • 2 POSIX信号量相关函数
    • 3 基于环形队列的生产消费模型

前言

在多线程编程领域,理解 POSIX 信号量的概念和相关函数是至关重要的。POSIX 信号量作为一种重要的同步原语,可以帮助我们在多线程环境中实现线程之间的协调与同步,从而确保数据的一致性和避免竞争条件的发生。

本篇博客旨在深入探讨 POSIX 信号量的基本概念和相关函数,帮助读者全面理解这一关键的并发编程工具。通过本文的学习,读者将能够掌握如何灵活地运用 POSIX 信号量来构建并发程序,提高程序的性能和可靠性。让我们一起深入探索 POSIX 信号量的奥秘,为多线程编程的世界增添新的智慧与力量。

1 POSIX信号量相关概念

POSIX信号量是什么?

信号量的本质是一个计数器,是用来描述临界资源有效的计数器

POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。
当多个线程想要获取信号量的时候,都会对信号量当中的资源计数器进行减一操作。
如果初始化信号量的资源计数器的值为1表示当前只有一个资源,这就意味着只有一个线程在同一时刻可以获取到信号量。
如果想要实现线程同步,初始化信号量的资源计数器的值就不必为1了,它可以根据需要设置

  • 如果大于0则表示还有多少资源可以使用
  • 等于0则表示没有资源可以使用
  • 小于0则表示有多少线程在等待资源。

2 POSIX信号量相关函数

  1. 信号量初始化
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:sem_t: 信号量的类型sem: 传入待要初始化的信号量pshared: 0 表示线程间共享,非0表示进程间共享value:信号量初始值
  1. 信号量销毁
int sem_destroy(sem_t *sem);
参数:sem:待销毁的信号量
  1. 信号量等待
功能:等待信号量,会将信号量的值减1int sem_wait(sem_t *sem); //P()
  1. 信号量发布
功能:发布信号量,表示资源使用完毕,可以归还资源了。将信号量值加1int sem_post(sem_t *sem);//V()

3 基于环形队列的生产消费模型

  • 上一个生产者-消费者的例子是基于queue的,其空间可以动态分配,现在基于固定大小的环形队列重写这个程序(POSIX信号量)。

image.png

  • 环形结构起始状态和结束状态都是一样的,不好判断为空或者为满,所以可以通过加计数器或者标记位来判断满或者空。另外也可以预留一个空的位置,作为满的状态

image.png
但是我们现在有信号量这个计数器,就很简单的进行多线程间的同步过程
实现代码如下:
RingQueue.cc

#pragma#include<iostream>
#include<unistd.h>
#include<vector>
#include<semaphore.h>
#include<stdlib.h>#define NUM 10class RingQueue
{
private:std::vector<int> v;int _cap;//容量sem_t sem_product;//生产者sem_t sem_consume;//消费者int p_index;//生产者索引int c_index;//消费者索引public:RingQueue(int cap=NUM):_cap(cap),v(cap){sem_init(&sem_product,0,cap);sem_init(&sem_consume,0,0);p_index = 0;c_index = 0;}~RingQueue(){sem_destroy(&sem_product);sem_destroy(&sem_consume);}void put(const int&in){sem_wait(&sem_product);v[p_index] = in;p_index++;p_index = p_index%NUM;sem_post(&sem_consume);}void get(int &out){sem_wait(&sem_consume);out = v[c_index];c_index++;c_index = c_index%NUM;sem_post(&sem_product);}
};

main.cc

#include"RingQueue.cc"
using namespace std;void* Consumer(void* arg){RingQueue *bq = (RingQueue*)arg;int data;while(1){bq->get(data);cout<<"I am "<<pthread_self()<<" is consumer : "<<data<<endl;}
}void* Product(void* arg){RingQueue* bq = (RingQueue*)arg;srand((unsigned int)time(NULL));while(1){int data = rand()%100;bq->put(data);cout<<"I am "<<pthread_self()<<" is product "<<data<<endl;sleep(1);}
}int main()
{RingQueue* pq = new RingQueue();pthread_t c;pthread_t p;pthread_create(&c,NULL,Consumer,(void*)pq);pthread_create(&p,NULL,Product,(void*)pq);pthread_join(c,NULL);pthread_join(p,NULL);return 0;
}

makefile

main:main.ccg++ -o $@ $^ -lpthread
.PHONY:
clean:rm -f main

结果:
可以观察到生产一个消费一个
image.png

http://www.dinnco.com/news/76661.html

相关文章:

  • 访问自己做的网站吗优化教程网站推广排名
  • 想做个网站报价蔬菜价格怎么做黄冈seo
  • 临沂市建设局网站勘察设计哪里有做网络推广的
  • 做网站用的软件免费入驻的卖货平台
  • 如何建立公司网站多少钱开发小程序
  • 网站建设经费方案网络推广公司网站
  • 做网上水果网站的调查广东省最新疫情
  • 第一次装wordpress上海seo网站优化
  • 做自媒体的有哪些素材网站我想做电商
  • 抵押网站建设方案网页设计作品
  • 创业做招商加盟类网站赚钱网站如何推广出去
  • 网站开发付款方式和比例上海搜索排名优化公司
  • 专业的做网站的搜索引擎优化技术有哪些
  • 有服务器如何做网站企业培训权威机构
  • 呼伦贝尔旅游包车网站咋做网络推广工具有哪些
  • wordpress smtp配置搜索引擎优化培训
  • 三门峡市住房的城乡建设局网站win10必做的优化
  • 手机上能不能制作网站开发谷歌商店下载不了软件
  • 建设网站如何弄好几张网站背景百度一下首页极简版
  • 上海助君网络科技有限公司苏州首页排名关键词优化
  • dz做网站缺点长沙网站推广公司
  • 广东阳春市建设局网站新媒体seo培训
  • 班级网站怎么做ppt网络营销发展现状与趋势
  • wordpress编辑器换了seo综合查询中的具体内容有哪些
  • 基于互联网怎样做网站推广广州网站建设正规公司
  • 网络加速器海外简述seo的概念
  • 没有网站可以做百度直通车吗网络运营seo是什么
  • 模板建网站怎么做seo上海关键词优化方法
  • 宁波网站推广优化aso如何优化
  • 响应式表白网站源码郑州seo外包v1