阿里巴巴国际站运营模式wordpress 优化标题

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

阿里巴巴国际站运营模式,wordpress 优化标题,免费网页设计作业文件,资源交易网站代码信号量概念 这篇文章是以前写的#xff0c;里面讲了 System V的信号量的概念#xff0c;POSIX信号量和SystemV信号量作用相同#xff0c;都是用于同步操作#xff0c;达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。 信号量的概念 POSIX信号量的接口 初始化…信号量概念 这篇文章是以前写的里面讲了 System V的信号量的概念POSIX信号量和SystemV信号量作用相同都是用于同步操作达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。 信号量的概念 POSIX信号量的接口 初始化信号量 参数 pshared:0表示线程间共享非0表示进程间共享 value信号量初始值资源的初始值 销毁信号量  等待信号量P操作表示要使用资源将信号量值加1 发布信号量V操作表示资源使用完毕可以归还资源了将信号量值加1 基于环形队列的生产消费者模型 生产消费者模型       这篇文章里的生产者消费者模型是基于一个queue展开了也就是把queue当成一个整体来看当成一个资源我们对他进行加锁保护锁就相当于二元信号量。下面我们把这个生产者消费者模型改一下是基于环形队列的不把环形队列看成一个整体把环形队列里的每个块看成很多个资源这时候线程并发访问时会产生问题就需要用信号量来解决 环形队列采用数组模拟用模运算来模拟环状特性生产者Prpducter向队列里生产任务消费者Consumer向队列里拿数据 怎么判空和满 当PV指向同一个位置的时候就是空或者满 怎么保证它们不访问同一个位置 用信号量来管理 生产者关注的是空间资源消费者关注的是数据资源这两种资源可以分别用两种信号量来管理 假如开始的时候空间资源是队列的大小数据资源为0此时生产者可以申请空间资源信号量成功他就可以生产但是消费者申请数据资源信号量时就失败等待用两个信号量来管理者两个资源就可以很好的让生产者消费者同时访问同一个队列但是不会访问到同一个位置就可以很好的解决上面的问题 实现代码 大家可以把他们复制到VS Code下来看 main.cc #includeiostream #includectime #includeunistd.h #includeRingQueue.hpp #includetask.hppusing namespace std; struct ThreadData {RingQueueTask* rq;string threadname; };void* Consumer(void* args) {ThreadData* datastatic_castThreadData(args);RingQueueTask rqdata-rq;string namedata-threadname;while(true){//消费任务Task t;rq-Pop(t);//处理任务t.run();printf(消费者得到一个任务%s,who:%s,结果%s\n,t.GetTask().c_str(),name.c_str(),t.GetResult().c_str());//用printf输出比较好不会错乱cout打印有时会错乱// cout消费者得到一个任务t.GetTask(),who: name结果为t.GetResult()endl;// sleep(1);}return nullptr; } void* Producter(void* args) {ThreadData* datastatic_castThreadData(args);RingQueueTask rqdata-rq;string namedata-threadname;while(true){//获取数据int data1rand()%101;int data2rand()%5;char opopers[rand()%opers.size()];Task t(data1,data2,op);//生产任务rq-Push(t);printf(生产者生产一个任务%s,who:%s\n,t.GetTask().c_str(),name.c_str());//用printf输出比较好不会错乱cout打印有时会错乱// cout生产者生产一个任务t.GetTask(),who: nameendl;sleep(1);}return nullptr; }int main() {srand(time(nullptr));RingQueueTask* rqnew RingQueueTask(10);pthread_t c[5], p[3];for (int i 0; i 3; i){ThreadData *td new ThreadData();td-rq rq;td-threadname Productor- std::to_string(i);pthread_create(p i, nullptr, Producter, td);}for (int i 0; i 5; i){ThreadData td new ThreadData();td-rq rq;td-threadname Consumer- std::to_string(i);pthread_create(c i, nullptr, Consumer, td);}for (int i 0; i 3; i){pthread_join(p[i], nullptr);}for (int i 0; i 5; i){pthread_join(c[i], nullptr);}return 0; } RingQueue.hpp #pragma once #includeiostream #includestring #includevector #includepthread.h #include semaphore.husing namespace std;templateclass T class RingQueue { public:void P(sem_t sem){sem_wait(sem);}void V(sem_t sem){sem_post(sem);}void Lock(pthread_mutex_t mutex){pthread_mutex_lock(mutex);}void Unlock(pthread_mutex_t mutex){pthread_mutexunlock(mutex);} public:RingQueue(int maxcap5):maxcap(maxcap),ringqueue_(maxcap),cindex(0),pindex(0){sem_init(cdatasem,0,0);sem_init(pspacesem,0,maxcap);pthread_mutex_init(cmutex,nullptr);pthread_mutex_init(pmutex,nullptr);}void Push(const T in)//生产{P(pspacesem);//生产者关注空间资源申请空间资源空间资源–Lock(pmutex);//下标也是共享资源需要加锁保护ringqueue_[pindex]in;pindex;pindex%maxcap_;//维持环形特性Unlock(pmutex);V(cdatasem);//数据资源增多了数据资源}void Pop(T out)//消费{P(cdatasem);//消费者关注数据资源申请数据资源数据资源–Lock(cmutex);//下标也是共享资源需要加锁保护outringqueue_[cindex];cindex;cindex%maxcap_;//维持环形特性Unlock(cmutex);V(pspacesem);//消费了数据空间就增多了}~RingQueue(){sem_destroy(cdatasem);sem_destroy(pspacesem);pthread_mutex_destroy(cmutex);pthread_mutex_destroy(pmutex);}private:vectorT ringqueue;//用数组模拟环形队列int maxcap;//环形队列的最大容量int cindex;//消费者的下标int pindex;//生产者的下标sem_t cdatasem;//消费者关注的数据资源sem_t pspacesem;//生产者关注的空间资源pthread_mutex_t cmutex;pthread_mutex_t pmutex; }; Task.hpp #pragma once #include iostream #include stringusing namespace std; string opers-/%;enum {Divzero 1,Modzero,Unknown };class Task { public:Task(){}Task(int data1, int data2, char op) : _data1(data1), _data2(data2), _op(op), _result(0), _exitcode(0){}void run(){switch (_op){case :{_result _data1_data2;break;}case -:{_result _data1-_data2;break;}case :{_result _data1_data2;break;}case /:{if (_data2 0) _exitcode Divzero;else _result _data1/_data2;break;}case %:{if (_data2 0) _exitcode Modzero;else _result _data1%_data2;break;}default:{_exitcodeUnknown;break;}}}void operator()(){run();}string GetResult(){string rto_string(_data1);r_op;rto_string(_data2);r;rto_string(_result);r[;rto_string(_exitcode);r];return r;}string GetTask(){string rto_string(_data1);r_op;rto_string(_data2);r?;return r;}private:int _data1;int _data2;char _op;int _result;int _exitcode; };