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

网站链接数看广告赚钱

网站链接数,看广告赚钱,免费手机小说网站建设,wordpress数据库文件目录 一、问题引入 二、实现线程同步的方案——条件变量 1、常用接口#xff1a; 2、使用示例 一、问题引入 我们再次看看上次讲到的多线程抢票的代码#xff1a;这次我们让一个线程抢完票之后不去做任何事。 #include iostream #include unistd.h #inc…目录 一、问题引入 二、实现线程同步的方案——条件变量 1、常用接口 2、使用示例 一、问题引入 我们再次看看上次讲到的多线程抢票的代码这次我们让一个线程抢完票之后不去做任何事。 #include iostream #include unistd.h #include cstring #include time.h #include pthread.husing namespace std; #define THREAD_NUM 5class threaddata { public:threaddata(const string s, pthread_mutex_t *m): name(s), mtx(m){}public:string name;pthread_mutex_t *mtx; };int ticket 100;void *getticket(void *arg) {threaddata *td (threaddata *)arg;while (true){pthread_mutex_lock(td-mtx); if (ticket 0) {usleep(rand() % 10000);cout td-name : ticket endl;ticket--;pthread_mutex_unlock(td-mtx); }else{pthread_mutex_unlock(td-mtx); break;}}delete td;return nullptr; }int main() {pthread_mutex_t mtx;pthread_mutex_init(mtx, nullptr);pthread_t t[THREAD_NUM];for (int i 0; i THREAD_NUM; i){string name thread ;name to_string(i 1);threaddata *td new threaddata(name, mtx);pthread_create(t i, nullptr, getticket, (void *)td);}for (int i 0; i THREAD_NUM; i)pthread_join(t[i], nullptr);pthread_mutex_destroy(mtx);return 0; } 运行结果 我们这就发现了一个问题对于抢票系统我们看到的是只有一个线程5在一直连续抢票没有其他的线程。这很不合理。 这是因为如果个别线程的竞争力特别强每次都能够申请到锁但申请到锁之后什么也不做所以在我们看来这个线程就一直在申请锁和释放锁那么它就可以一直抢票。这就可能导致其他线程长时间竞争不到锁造成了其他线程的饥饿问题无法抢票。虽然你是拿到锁后再去访问临界资源并且最后还释放了锁由于竞争能力太强可以一直拿到锁这没有错但这不合理。 为了解决这个问题我们增加一个限制当一个线程释放锁后这个线程不能立马再次申请锁该线程必须排到这个锁的资源等待队列的最后。这样我们就有了线程同步我们在保证数据安全的情况下让这些线程按照一定的顺序进行临界资源的访问这就是线程同步。 竞态条件因为时序问题而导致程序异常我们称为竞态条件。 二、实现线程同步的方案——条件变量 当一个线程互斥地访问某个变量时它可能发现在其他线程改变状态之前它什么也做不了 例如一个线程访问队列时发现队列为空它只能等待直到其他线程将一个节点添加到队列中。这种情况就需要用到条件变量。 1、常用接口 1、条件变量的定义和初始化 ​ NAMEpthread_cond_destroy, pthread_cond_init - destroy and initialize condition variablesSYNOPSIS#include pthread.h//销毁int pthread_cond_destroy(pthread_cond_t *cond);//初始化int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);//全局和静态变量初始化pthread_cond_t cond PTHREAD_COND_INITIALIZER; 2、线程等待临界资源  pthread_cond_wait 功能一就是让线程在特定的条件变量下等待二就是让线程在等待时释放对应的互斥锁。当线程被唤醒时该函数会帮助我们线程获取锁。 #include pthread.h //特定时间阻塞等待 int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime); //等待 int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex); 3、唤醒线程去访问临界资源 #include pthread.h // 唤醒所有等待的线程 int pthread_cond_broadcast(pthread_cond_t *cond);// 唤醒一个线程 int pthread_cond_signal(pthread_cond_t *cond); 注1、条件变量通常需要配合互斥锁一起使用。 2、条件变量的使用一个线程等待条件变量的条件成立而被挂起另一个线程使条件成立后唤醒等待的线程。 3、等待的时候往往是在临界区内等待的。加锁与解锁之间的区域进行等待 4、线程被唤醒是在之前进行等待的地方被唤醒。 2、使用示例 有了线程同步我们就可以改进我们之前的抢票系统的代码 #include iostream #include string #include time.h #include unistd.h #include pthread.husing namespace std; #define THREADNUM 3 typedef void *(*func)(void *argc);class threaddata { public:threaddata(pthread_mutex_t *mtx, pthread_cond_t *cond, const string name): mtx_(mtx), cond_(cond), name_(name){}public:pthread_mutex_t *mtx_;pthread_cond_t *cond_;string name_; };int ticket 100;void *getticket(void *arg) {threaddata *td (threaddata *)arg;while (true){pthread_mutex_lock(td-mtx_);pthread_cond_wait(td-cond_, td-mtx_); // 在加锁和解锁之间进行等待if (ticket 0){usleep(rand() % 10000);cout td-name_ : ticket endl;ticket--;pthread_mutex_unlock(td-mtx_);}else{pthread_mutex_unlock(td-mtx_);break;}}delete td;return nullptr; }void *fun1(void *arg) {threaddata *td (threaddata *)arg;while (true){getticket((void *)td);sleep(1);} }void *fun2(void *arg) {threaddata *td (threaddata *)arg;while (true){getticket((void *)td);sleep(1);} }void *fun3(void *arg) {threaddata *td (threaddata *)arg;while (true){getticket((void *)td);sleep(1);} }int main() {srand((unsigned long)time(nullptr) ^ getpid() ^ 433);pthread_mutex_t mtx;pthread_cond_t cond;pthread_mutex_init(mtx, nullptr);pthread_cond_init(cond, nullptr);pthread_t t[THREADNUM];func fun[THREADNUM] {fun1, fun2, fun3};for (int i 0; i THREADNUM; i){string name thread ;name to_string(i 1);threaddata *td new threaddata(mtx, cond, name);pthread_create(t i, nullptr, fun[i], (void *)td);}sleep(5);while (true){pthread_cond_signal(cond);sleep(1);}for (int i 0; i THREADNUM; i)pthread_join(t[i], nullptr);pthread_mutex_destroy(mtx);pthread_cond_destroy(cond);return 0; } 如果我们每次都想将在该条件变量下等待的所有线程进行唤醒可以将代码中的pthread_cond_signal函数改为pthread_cond_broadcast函数。  此时我们会发现唤醒这三个线程时具有明显的顺序性因为这些线程启动时默认都会在该条件变量下去等待而我们每次都唤醒的是在当前条件变量下等待的头部线程当该线程执行完代码后会继续排到等待队列的尾部进行等待。
http://www.zqtcl.cn/news/543647/

相关文章:

  • 四川省建设厅注册管理中心网站设计上海2021门票
  • 帝国cms做微网站人力资源公司怎么开
  • 网站建设学徒松江品划做网站公司
  • 灯饰网站需要这么做深圳专业网站设计公司
  • 政务网站设计wordpress 嵌入html5
  • 移动网站 pc网站的区别吗网站建设工厂
  • 有意义网站织梦圈子如何调用网站默认模板
  • 南京公司网站模板建站网页制作中的网站维护
  • 微信分享 淘宝网站 怎么做wordpress访问慢
  • 网站后台制作沈阳营销型网站制作技术
  • 微页制作平台网站建设wordpress文章显示数量
  • 望野古诗王绩seo优化系统
  • 网站设计大概流程惠城区龙丰街道
  • 游戏平台十大排名南宁seo优化公司
  • 佛山外贸网站建设方案企业管理控制系统
  • 分类信息网站如何做排名品牌建设卓有成效
  • 企业网站报价方案模板下载营销软件crm
  • 湛江网站开发哪家专业东莞营销型手机网站建设
  • 做个外贸的网站不懂英语咋做做网站 嵌入支付
  • 官方模板关键字生成的代码添加在网站的什么地方?网站 建设 培训 视频
  • 做网站时图片要切片有什么作用网站导航栏模板怎么做
  • 网站做数据分析网站开发为什么不用cgi了
  • 有了网址可以建网站吗软件外包项目网站
  • 威海设计网站的单肩包自定义页面设计模板
  • 制作一个网站首页中国建设个人网上银行官网
  • 厦门开发网站公司购买手表网站
  • 网站模板排名vs做网站加背景
  • 思途旅游网站建设系统郴州新网招聘
  • 婚庆公司网站模板下载海域装饰
  • 微信小程序是干什么用的永康网站优化