有了自己的域名怎么做网站,海东市网站建设,购物的网站功能,网站设计与规划论文文章目录 一、多线程的同步
1.概念
2.条件变量
2.1条件变量概念
2.2条件变量接口
1.条件变量初始化
2.等待条件满足
3.唤醒等待
3.销毁条件变量
2.3条件变量demo
二、生产消费模型
1.生产消费模型
2.基于BlockQueue的生产者消费者模型
3.基于C用条件变量和互斥锁实… 文章目录 一、多线程的同步
1.概念
2.条件变量
2.1条件变量概念
2.2条件变量接口
1.条件变量初始化
2.等待条件满足
3.唤醒等待
3.销毁条件变量
2.3条件变量demo
二、生产消费模型
1.生产消费模型
2.基于BlockQueue的生产者消费者模型
3.基于C用条件变量和互斥锁实现一个生产消费模型
4.信号量
1.信号量概念
2.信号量接口
1.初始化信号量
2.等待信号量P操作 --)
3.发布信号量(V操作 )
4.销毁信号量
5.环形生产者消费者模型 当一个线程互斥地访问某个变量时它发现可能再其他线程改变状态之前它被挂起。
例如一个线程访问队列发现队列为空它只能等待。直到其他线程将一个节点加入到队列中这种情况就需要用到条件变量。
一、多线程的同步
1.概念 在保证数据安全的前提下让线程能够按照某种特定的顺序访问临界资源从而有效避免饥饿问题叫做同步。 2.条件变量
2.1条件变量概念 条件变量是线程同步的一种手段如果只有一个线程条件不满足一直等待下去都不会满足所以必须要有一个线程通过某些操作改变共享变量使得原来的不满足条件变的满足并且友好通知等待在条件变量上的线程。 条件变量不会无缘无故满足必然牵扯到共享数据的变化所以一定需要用锁来保护没有锁就无法安全的获取和修改共享数据 2.2条件变量接口
1.条件变量初始化
int pthread_cond_init(pthread_cond_t * restrict cond,const pthread_condattr_t * restrict attr);参数cond 要初始化的条件变量attr:NULL2.等待条件满足
int pthread_cond_wait(pthread_cond_t * restrict cond,pthread_mutex_t * restrict mutex);参数cond: 要在这个条件变量上等待mutex:互斥量等待的时候要释放掉这个锁
3.唤醒等待
int pthread_cond_broadcast(pthread_cond_t * cond);
int pthread_cond_signal(pthread_cond_t * cond);
3.销毁条件变量
int pthread_cond_destroy(pthread_cond_t * cond);
2.3条件变量demo
#includeiostream
#includepthread.h
#includeunistd.h
#includecstdio
#includestring
using namespace std;const int num 5;
pthread_cond_t cond PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER;void *active(void *args)
{string name static_castconst char*(args);while(true){pthread_mutex_lock(mutex);pthread_cond_wait(cond,mutex);// 在调用的时候会自动释放锁coutname activing...endl;pthread_mutex_unlock(mutex);}}
int main()
{pthread_t tids[num];for(int i 0; inum;i){char * name new char[32];snprintf(name,32,thread-%d,i1);pthread_create(tidsi,nullptr,active,name);}sleep(3);while(true){coutmain thread wakeup threadendl;pthread_cond_signal(cond);sleep(1);}for(int i 0; inum;i){pthread_join(tids[i],nullptr);}}二、生产消费模型
1.生产消费模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯而通过阻塞队列来进行通讯所以生产者生产完数据之后不用等待消费者处理直接扔给阻塞队列消费者不找生产者要数据而是直接从阻塞队列里取阻塞队列就相当于一个缓冲区平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。 2.基于BlockQueue的生产者消费者模型 在多线程编程中阻塞队列 (Blocking Queue) 是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于当队列为空时从队列获取元素的操作将会被阻塞直到队列中被放入了元素当队列满时往队列里存放元 素的操作也会被阻塞直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的线程在对阻塞队列进程 操作时会被阻塞。 3.基于C用条件变量和互斥锁实现一个生产消费模型 需求使用条件变量和互斥锁实现一个生产消费模型。生产消费模型是一个队列如上图这里使用stl中的队列先实现单生产单消费一个线程负责生产一个线程负责消费。这两个线程需要访问同一个队列所以需要一把锁。在线程挂起的时候还需要有信号告诉线程现在条件满足了所以要使用两个条件变量分别通知生产和消费线程转为就绪态。 实现将这个模型封装成一个类两个线程去访问的时候队列非满就可以生产往队列里push数据队列中数据非空就可以消费从队列里pop数据。所以需要两个接口push和pop,调试成功后最后使用多生产多消费实现。实现代码如下 //blockqueue.hpp 声明方法定义在一个文件中const int gcap 5;
templateclass T
class blockQueue
{public://构造blockQueue(const int cap gcap):_cap(cap),{pthread_mutex_init(_mutex,nullptr);pthread_cond_init(_consumerCond,nullptr);pthread_cond_init(_productorCond,nullptr);}bool isFull() {return _q.size() _cap;}bool isEmpty() { return _q.empty()};//将数据塞进队列 生产void push(const T in){pthread_mutex_lock(_mutex);//注意这里不要用if可能会误唤醒while(isFull()){//在当前的条件下休眠就注定了要释放锁让别的线程去竞争锁//休眠就是被os切走了醒来之后又要重新申请锁pthread_cond_wait(_productorCond,_mutex); }//如果没满就让他继续生产_q.push(in);//生产之后让消费者来消费唤醒消费的线程 再释放自己手中的锁pthread_cond_signal(_consumerCond);pthread_mutex_unlock(_mutex);}//队列非空 消费 void pop(){pthread_mutex_lock(_mutex);//判断队列是否为空while(isEmpty()){//空的话在当前条件下休眠pthread_cond_wait(_consumerCond,_mutex);}//非空 开始消费 并且唤醒生产者 可以生产了pthread_cond_signal(_productorCond);pthread_mutex_unlock(_mutex);}//析构~blockQueue(){//释放锁和两个信号量 队列是一个临时变量可以不用在这里释放pthread_mutex_destroy(mutex);pthread_cond_destroy(_consumerCond);pthread_cond_destroy(_productorCond);}private:std::queueT _q;int _cap; //队列中的容量pthread_mutex_t _mutex;pthread_cond_t _consumerCond; //消费者对应的条件变量如果队列中数据为空,waitpthread_cond_t _productorCond; //生产者对应的条件变量如果队列中数据为满wait
}; 4.信号量
1.信号量概念 POSIX信号量和System V 信号量作用相同都是用于同步操作达到无冲突访问共享资源的目的。但是POSIX可以用于线程间同步。信号量本质就是用来描述临界资源中的数量 sem 1,就只有0/1两种状态就是互斥锁。 多元信号量每个线程在访问对应资源时先申请信号量。申请成功就表示现在可以时候该资源。申请失败就目前无法访问。
2.信号量接口
#includesemaphore.h1.初始化信号量
int sem_init(sem_t * sem, int pshared ,unsiged int value);参数:pshared 0 表示线程间共享非0 表示进程间共享value:信号量初始值2.等待信号量P操作 --)
int sem_wait(sem_t * sem);
3.发布信号量(V操作 )
int sem_post(sem_t * sem);
4.销毁信号量
int sem_destroy(sem_t * sem);
5.环形生产者消费者模型 环形队列采用数组模拟用%运算来模拟环状特性。在为空/满的时候要保证游戏规则在非空非满的时候保证并发。 环形结构起始状态和结束状态都是一样的不容易判断是空还是满所以通过加计数器或者标记位来判断。另外也可以预留一个空的位置作为满的状态。
但是我们现在有信号量这个计数器就可以进行多线程间的同步过程。
生产者关心这个空间是否满了消费者关心是否有数据。环形队列只要访问不同的区域生产和消费行为可以同时进行。 需求生产消费模型是一个队列使用数组模拟同时需要两个线程生产线程和消费线程。要维护3种关系生产者和生产者消费者和消费者生产者和消费者之间的关系。其中生产者和生产者需要互斥。消费者和消费者同样互斥。生产者和消费者需要先生产再消费所以需要同步。同时访问同一个队列共享资源需要互斥关系。 实现将队列封装成类用数组模拟实现。类需要暴露的接口就是push和pop即实现p操作和v操作。同时要知道这个队列的大小定义两个信号量一个是消费者关心的一个是生产者关心。申请信号量成功之后也要知道生产和消费此刻对应队列中的位置就是具体维护哪个区域。即两个下标。申请自己关心的资源互相V对方的资源 static const int N 5templateclass T
class RingQueue
{private:void P(sem_t s){sem_wait(s);}void V(sem_t s){sem_post(s);}public://构造RingQueue(int num N):_ring(num),_cap(num){sem_init(_data_sem,0,0); sem_init(_space_sem,0,num);//刚开始都为0_c_step _p_step 0;}void push(const T in){//申请P(_space_sem);_ring[_p_step] in;_p_step % _cap;V(_data_sem);}void pop(T * out){P(_data_sem);*out _ring[_c_step];_c_step _cap;V(_spcae_sem);}~RingQueue(){sem_destroy(_data_sem);sem_destroy(_space_sem);}private:std::vectorT _ring;int _cap;sem_t _data_sem;sem_t _space_sem;int _c_step;int _p_step;
}; 文章转载自: http://www.morning.ncfky.cn.gov.cn.ncfky.cn http://www.morning.fmkjx.cn.gov.cn.fmkjx.cn http://www.morning.gagapp.cn.gov.cn.gagapp.cn http://www.morning.ptzbg.cn.gov.cn.ptzbg.cn http://www.morning.jrplk.cn.gov.cn.jrplk.cn http://www.morning.mnclk.cn.gov.cn.mnclk.cn http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn http://www.morning.kttbx.cn.gov.cn.kttbx.cn http://www.morning.qwnqt.cn.gov.cn.qwnqt.cn http://www.morning.wqbzt.cn.gov.cn.wqbzt.cn http://www.morning.pbgnx.cn.gov.cn.pbgnx.cn http://www.morning.bpxmw.cn.gov.cn.bpxmw.cn http://www.morning.lrjtx.cn.gov.cn.lrjtx.cn http://www.morning.ljtwp.cn.gov.cn.ljtwp.cn http://www.morning.rlwgn.cn.gov.cn.rlwgn.cn http://www.morning.qwlml.cn.gov.cn.qwlml.cn http://www.morning.lpmjr.cn.gov.cn.lpmjr.cn http://www.morning.jkdtz.cn.gov.cn.jkdtz.cn http://www.morning.qwfl.cn.gov.cn.qwfl.cn http://www.morning.tzzxs.cn.gov.cn.tzzxs.cn http://www.morning.jpgfq.cn.gov.cn.jpgfq.cn http://www.morning.krgjc.cn.gov.cn.krgjc.cn http://www.morning.nrfrd.cn.gov.cn.nrfrd.cn http://www.morning.fphbz.cn.gov.cn.fphbz.cn http://www.morning.qpnmd.cn.gov.cn.qpnmd.cn http://www.morning.kqyyq.cn.gov.cn.kqyyq.cn http://www.morning.cprbp.cn.gov.cn.cprbp.cn http://www.morning.smj79.cn.gov.cn.smj79.cn http://www.morning.lfbzg.cn.gov.cn.lfbzg.cn http://www.morning.pghgq.cn.gov.cn.pghgq.cn http://www.morning.qpfmh.cn.gov.cn.qpfmh.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.rpfpx.cn.gov.cn.rpfpx.cn http://www.morning.touziyou.cn.gov.cn.touziyou.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.grxsc.cn.gov.cn.grxsc.cn http://www.morning.qsy37.cn.gov.cn.qsy37.cn http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.tllhz.cn.gov.cn.tllhz.cn http://www.morning.gwkjg.cn.gov.cn.gwkjg.cn http://www.morning.qfzjn.cn.gov.cn.qfzjn.cn http://www.morning.ksjmt.cn.gov.cn.ksjmt.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.wbdm.cn.gov.cn.wbdm.cn http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn http://www.morning.rhqr.cn.gov.cn.rhqr.cn http://www.morning.china-cj.com.gov.cn.china-cj.com http://www.morning.lmfmd.cn.gov.cn.lmfmd.cn http://www.morning.plfy.cn.gov.cn.plfy.cn http://www.morning.fhtmp.cn.gov.cn.fhtmp.cn http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn http://www.morning.ktdqu.cn.gov.cn.ktdqu.cn http://www.morning.kgqww.cn.gov.cn.kgqww.cn http://www.morning.hprmg.cn.gov.cn.hprmg.cn http://www.morning.bnmrp.cn.gov.cn.bnmrp.cn http://www.morning.zhiheliuxue.com.gov.cn.zhiheliuxue.com http://www.morning.zhnyj.cn.gov.cn.zhnyj.cn http://www.morning.kndt.cn.gov.cn.kndt.cn http://www.morning.nmyrg.cn.gov.cn.nmyrg.cn http://www.morning.lcxdm.cn.gov.cn.lcxdm.cn http://www.morning.rmfh.cn.gov.cn.rmfh.cn http://www.morning.nnjq.cn.gov.cn.nnjq.cn http://www.morning.ktmnq.cn.gov.cn.ktmnq.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.yrdt.cn.gov.cn.yrdt.cn http://www.morning.chkfp.cn.gov.cn.chkfp.cn http://www.morning.dtlqc.cn.gov.cn.dtlqc.cn http://www.morning.skqfx.cn.gov.cn.skqfx.cn http://www.morning.ppwdh.cn.gov.cn.ppwdh.cn http://www.morning.qsy41.cn.gov.cn.qsy41.cn http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn http://www.morning.lcjw.cn.gov.cn.lcjw.cn http://www.morning.hcxhz.cn.gov.cn.hcxhz.cn http://www.morning.bkslb.cn.gov.cn.bkslb.cn http://www.morning.wdwfm.cn.gov.cn.wdwfm.cn http://www.morning.pjrql.cn.gov.cn.pjrql.cn http://www.morning.gthwr.cn.gov.cn.gthwr.cn http://www.morning.ljzqb.cn.gov.cn.ljzqb.cn http://www.morning.jfnlj.cn.gov.cn.jfnlj.cn http://www.morning.tjjkn.cn.gov.cn.tjjkn.cn