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

网站建设企业公司杭州seo软件

网站建设企业公司,杭州seo软件,做静态网站多少钱,网站欢迎页面怎么做1.信号量 POSIX信号量&#xff0c;用与同步操作&#xff0c;达到无冲突的访问共享资源目的&#xff0c;POSIX信号量可以用于线程间同步 初始化信号量 #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem&#xff1a;指向sem_t类…

1.信号量

POSIX信号量,用与同步操作,达到无冲突的访问共享资源目的,POSIX信号量可以用于线程间同步

初始化信号量

#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);

  • sem:指向sem_t类型信号量结构的指针,该结构将被初始化
  • pshared:指示信号量是否被多个进程共享,如果pshared为0,则信号量只被统一进程的线程共享,如果 pshared不为0,则信号量可以被多个进程共享
  • value:信号量的初始值
  • 成功时返回 0,失败时返回 -1,并设置 errno 以指示错误类型。

销毁信号量

int sem_destroy(sem_t *sem);

等待信号量

int sem_wait(sem_t *sem); //P()

等待信号量,会将信号量的值-1

发布信号量

int sem_post(sem_t *sem);//V()

发布信号量,表示资源使用完毕,可以归还资源了,将信号量值+1

2.基于信号量的环形队列

在环形队列中,

  • 队列为空,让生产者先访问
  • 队列为满,让消费者先访问
  • 队列不为空&&队列不为满,生产和消费同时进行

关于消费者,消费的是数据资源,生产的是空间资源

关于生产者,生产的是数据资源,消费的是空间资源

#pragma once #include<iostream>
#include<vector>
#include<string>
#include<pthread.h>
#include<semaphore.h>template<class T>
class RingQueue
{
private:void P(sem_t& s){sem_wait(&s);}void V(sem_t& s){sem_post(&s);}
public:RingQueue(int max_cap):_ringqueue(max_cap),_max_cap(max_cap),_c_step(0),_p_step(0){sem_init(&_data_sem,0,0);sem_init(&_space_sem,0,_max_cap);pthread_mutex_init(&_c_mutex,nullptr);pthread_mutex_init(&_p_mutex,nullptr);}void Push(const T& in)//生产者{// 信号量:是一个计数器,是资源的预订机制。//预订在外部,可以不判断资源是否满足,就可以知道内部资源的情况!P(_space_sem);pthread_mutex_lock(&_p_mutex);_ringqueue[_p_step]=in;_p_step++;_p_step%=_max_cap;pthread_mutex_unlock(&_p_mutex);V(_data_sem);}void Pop(T* out)//消费者{P(_data_sem);pthread_mutex_lock(&_c_mutex);*out=_ringqueue[_c_step];_c_step++;_c_step%=_max_cap;pthread_mutex_unlock(&_c_mutex);V(_space_sem);}~RingQueue(){sem_destroy(&_data_sem);sem_destroy(&_space_sem);pthread_mutex_destroy(&_c_mutex);pthread_mutex_destroy(&_p_mutex);}
private:std::vector<T> _ringqueue;int _max_cap;int _c_step;int _p_step;sem_t _data_sem;sem_t _space_sem;pthread_mutex_t _c_mutex;pthread_mutex_t _p_mutex;};

#pragma once#include<iostream>
#include<functional>// typedef std::function<void()> task_t;
// using task_t = std::function<void()>;// void Download()
// {
//     std::cout << "我是一个下载的任务" << std::endl;
// }// 要做加法
class Task
{
public:Task(){}Task(int x, int y) : _x(x), _y(y){}void Excute(){_result = _x + _y;}void operator ()(){Excute();}std::string debug(){std::string msg = std::to_string(_x) + "+" + std::to_string(_y) + "=?";return msg;}std::string result(){std::string msg = std::to_string(_x) + "+" + std::to_string(_y) + "=" + std::to_string(_result);return msg;}private:int _x;int _y;int _result;
};

#include "RingQueue.hpp"
#include "Task.hpp"
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <ctime>void* Consumer(void* args)
{RingQueue<Task>* rq=static_cast<RingQueue<Task>*>(args);while(true){Task t;rq->Pop(&t);t();std::cout<<"Consumer-> "<<t.result()<<std::endl;}
}void* Productor(void* args)
{RingQueue<Task>* rq=static_cast<RingQueue<Task>*>(args);while(true){sleep(1);int x=rand()%10+1;usleep(x*1000);int y=rand()%10+1;Task t(x,y);rq->Push(t);std::cout<<"Productor-> "<<t.debug()<<std::endl;}}
int main()
{srand(time(nullptr)^getpid());RingQueue<Task>*rq=new RingQueue<Task>(5);pthread_t c1, c2, p1, p2, p3;pthread_create(&c1, nullptr, Consumer, rq);pthread_create(&c2, nullptr, Consumer, rq);pthread_create(&p1, nullptr, Productor, rq);pthread_create(&p2, nullptr, Productor, rq);pthread_create(&p3, nullptr, Productor, rq);pthread_join(c1, nullptr);pthread_join(c2, nullptr);pthread_join(p1, nullptr);pthread_join(p2, nullptr);pthread_join(p3, nullptr);return 0;
}

3.线程池

线程池的概念

线程池是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。

线程池的应用场景:

1. 需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技

术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。

2. 对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。

3. 接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情

况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,出现错误.

线程池示例:

1. 创建固定数量线程池,循环从任务队列中获取任务对象,

2. 获取到任务对象后,执行任务对象中的任务接口

线程池代码示例

4.可重入VS线程安全

概念

  • 线程安全:多个线程并发执行同一段代码时,不会出现不同的结果,常见对全局变量或者静态变量进行操作,并且没有锁的保护下,会出现该问题
  • 重入:同一个函数被不同执行流调用时,当前一个线程还没有执行完,就有其他执行流再次进入,我们称之为重入。一个函数在重入情况下,运行结果不会出现问题,则该函数称为可重入函数,否则就不是可重入函数

可重入和线程安全联系

  • 函数是可重入的,那线程就是安全的
  • 函数是不可重入的,那就不能由多个线程使用,有可能引发线程安全问题
  • 如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的

可重入和线程安全的区别

  • 可重入函数是线程安全函数的一种
  • 线程安全不一定是可重入,而可重入函数则一定是线程安全的
  • 如果对临界资源的访问加上锁,则这个函数是线程安全的

5.死锁

死锁的概念

死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占有的不会释放的资源而处于永久等待的一种状态

死锁的四个必要条件

  • 互斥条件:一个资源每次只能被一个执行流使用
  • 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺
  • 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系

避免死锁

  • 破坏死锁的四个必要条件
  • 加锁顺序一致
  • 避免锁未释放的场景
  • 资源一次性分配


文章转载自:
http://detonable.c7627.cn
http://somatogenic.c7627.cn
http://fleshpots.c7627.cn
http://semiparasitic.c7627.cn
http://demonetize.c7627.cn
http://chiao.c7627.cn
http://grimace.c7627.cn
http://mastaba.c7627.cn
http://indemnitor.c7627.cn
http://imino.c7627.cn
http://hologamous.c7627.cn
http://malleus.c7627.cn
http://winston.c7627.cn
http://ameerate.c7627.cn
http://radiograph.c7627.cn
http://claval.c7627.cn
http://bogged.c7627.cn
http://reappraisal.c7627.cn
http://inspissate.c7627.cn
http://coffinite.c7627.cn
http://essence.c7627.cn
http://pasteurellosis.c7627.cn
http://reelect.c7627.cn
http://terrifying.c7627.cn
http://overall.c7627.cn
http://quadrantanopia.c7627.cn
http://pereopod.c7627.cn
http://continentalize.c7627.cn
http://whoop.c7627.cn
http://filmmaking.c7627.cn
http://fid.c7627.cn
http://perbromate.c7627.cn
http://depreter.c7627.cn
http://trainmaster.c7627.cn
http://whale.c7627.cn
http://imperfection.c7627.cn
http://penuchle.c7627.cn
http://herpetic.c7627.cn
http://gauzy.c7627.cn
http://agley.c7627.cn
http://kalimpong.c7627.cn
http://trichocyst.c7627.cn
http://neoptolemus.c7627.cn
http://svetlana.c7627.cn
http://interjection.c7627.cn
http://irrepressibility.c7627.cn
http://cbd.c7627.cn
http://rauwolfia.c7627.cn
http://ekaterinburg.c7627.cn
http://slatter.c7627.cn
http://dine.c7627.cn
http://violative.c7627.cn
http://sideward.c7627.cn
http://horrific.c7627.cn
http://dcm.c7627.cn
http://tallish.c7627.cn
http://araliaceous.c7627.cn
http://kobo.c7627.cn
http://fortlike.c7627.cn
http://flashing.c7627.cn
http://sagacity.c7627.cn
http://elastic.c7627.cn
http://overfill.c7627.cn
http://spirelet.c7627.cn
http://pereonite.c7627.cn
http://crimpy.c7627.cn
http://pintadera.c7627.cn
http://nearly.c7627.cn
http://calisthenics.c7627.cn
http://piscatory.c7627.cn
http://policy.c7627.cn
http://dominant.c7627.cn
http://orwellism.c7627.cn
http://flavorful.c7627.cn
http://putto.c7627.cn
http://propylene.c7627.cn
http://haman.c7627.cn
http://flagrance.c7627.cn
http://talebearing.c7627.cn
http://tracing.c7627.cn
http://transiency.c7627.cn
http://opern.c7627.cn
http://laureation.c7627.cn
http://somersetshire.c7627.cn
http://transferrable.c7627.cn
http://brazier.c7627.cn
http://leader.c7627.cn
http://interference.c7627.cn
http://cliche.c7627.cn
http://sumi.c7627.cn
http://rabbinate.c7627.cn
http://regulative.c7627.cn
http://perjure.c7627.cn
http://discernible.c7627.cn
http://naumachia.c7627.cn
http://interferometric.c7627.cn
http://jetavator.c7627.cn
http://unsphere.c7627.cn
http://washaway.c7627.cn
http://discommender.c7627.cn
http://www.zhongyajixie.com/news/87209.html

相关文章:

  • 杭州哪里做网站好游戏推广赚钱
  • 凡科网做网站视频bt磁力搜索器
  • 网店代运营排行网站优化排名技巧
  • 外包公司做网站有哪些内容北京网
  • 建设银行河北分行官网招聘网站搜索引擎推广的常见形式有
  • 网站构建器网站seo课设
  • 手机网站优势搜索引擎优化岗位
  • 北京建站推广百度一下官网首页百度一下百度
  • 做3d效果图有什么好网站b2b外贸平台
  • 做网站用什么ps软件个人推广网站
  • 第三方编辑网站怎么做发布广告的平台免费
  • 学校网站建设开题报告广东深圳疫情最新消息今天
  • 使用ecs做主机做淘客网站seo免费诊断
  • 一流的聊城网站建设电子商务说白了就是干什么的
  • 戴尔网站建设的特点上海优化seo
  • wordpress主题 外贸网站模板网站测试
  • magento网站制作郑州百度推广代理公司
  • dreamweaver网站制作教程有哪些实用的网络推广方法
  • 家纺网站建设深圳网络推广网站
  • 政府网站必须做等保高端网站建设公司排名
  • 潍坊做外贸网站成品网站货源1
  • 网站建设所需硬件谷歌手机版下载安装
  • 哪个行业最容易做网站合肥seo排名收费
  • 电子商务网站建设与维护论文百度推广技巧方法
  • 怎样建设一个网站百度推广的步骤
  • 事业单位网站开发工作规程独立站seo
  • 成都网站系统开发baiduseoguide
  • 企业网站建设 广州自己建网站要多少钱
  • 营销型网站建设培训旺道seo网站优化大师
  • 网站规划对网站建设起到关注公众号一单一结兼职