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

edo网站建设wordpress签到插件下载

edo网站建设,wordpress签到插件下载,高性能网站建设进阶指南pdf,时尚网页设计在之前的线程学习中#xff0c;用到的锁都是挂起等待锁#xff0c;如果申请不到锁#xff0c;那就会在锁中等待#xff1b; 自旋锁则不大相似 文章目录1.自旋锁1.1 概念1.2 接口1.2.1 pthread_spin_init/destroy1.2.2 pthread_spin_lock1.2.3 pthread_spin_unlock2.读写锁…在之前的线程学习中用到的锁都是挂起等待锁如果申请不到锁那就会在锁中等待 自旋锁则不大相似 文章目录1.自旋锁1.1 概念1.2 接口1.2.1 pthread_spin_init/destroy1.2.2 pthread_spin_lock1.2.3 pthread_spin_unlock2.读写锁2.1 读者写者的关系2.2 接口2.2.1 init/destroy2.2.2 读者加锁2.2.3 写者加锁2.2.4 设置锁的属性2.3 代码1.自旋锁 1.1 概念 自旋锁是一个轮询检测锁其检测机制并不是挂起等待而是不断的询问锁有没有空闲类似于一个while(1)循环的trylock() 由于其需要不断的轮询检测所以会占用一定的CPU资源如果线程较多就容易给cpu造成负荷。 但是自旋锁无须唤醒挂起等待状态的线程其消耗较小。 总结一下 自旋锁适合竞争不激烈且临界区较小呆的时间短的情况自旋锁不适合大量线程临界区长的情况 自旋锁的优缺点反过来便是挂起等待锁的优缺点了。我们要根据不同场景正确选择锁的类型 1.2 接口 相关接口和mutex都是很相似的这里就不演示使用的效果了 1.2.1 pthread_spin_init/destroy #include pthread.hint pthread_spin_destroy(pthread_spinlock_t *lock); int pthread_spin_init(pthread_spinlock_t *lock, int pshared);1.2.2 pthread_spin_lock 自旋锁同样有trylock接口用于判断锁是否就绪 #include pthread.h int pthread_spin_lock(pthread_spinlock_t *lock); int pthread_spin_trylock(pthread_spinlock_t *lock);1.2.3 pthread_spin_unlock #include pthread.h int pthread_spin_unlock(pthread_spinlock_t *lock);2.读写锁 有的时候我们会有一份config配置文件这个配置文件会有非常多的线程进行读取但是很少进行修改和写入。 此时我们如果对配置文件的读取进行加锁就容易导致效率问题众多线程不断被阻塞产生性能损失。 此时就可以用一个专门的读写锁对读者和写者加不同的锁在提升读取性能的同时保证写入不冲突 2.1 读者写者的关系 写着和写着之间不用多说肯定是互斥关系 读者和写者之间也是互斥关系在写入的时候不能进行读取否则容易出现二义性问题 写者写入了一个a线程甲来读取得到的结果是a写者继续写入了b线程乙来读取得到的结果是ab 这是因为写者的写入还没有完成导致甲乙读者会获取到完全不同的结果这是不对的 读者和读者之间没有关系因为读者并不会修改数据也不会取走数据其存在对临界资源没有影响。 2.2 接口 2.2.1 init/destroy 读写锁只需要初始一个锁就行了无须对读者写者初始化两个不同的锁 #include pthread.hint pthread_rwlock_destroy(pthread_rwlock_t *rwlock); int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);2.2.2 读者加锁 读写锁的读者锁/写者锁是分开的我们要针对不同的线程调用不同的锁 #include pthread.hint pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);但是解锁的接口是一样的 #include pthread.h int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);2.2.3 写者加锁 #include pthread.h int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);2.2.4 设置锁的属性 参考 PTHREAD_RWLOCKATTR_SETKIND_NP - Linux手册页 读写锁可以允许我们设置是读者优先还是写者优先。如果采用默认的属性可能会出现读者一直在读写者没有办法写入的情况打印错位是正常情况 [muxuebt-7274:~/git/linux/code/23-01-20 rwlock]$ ./test reader [140484801697536] reader [140484801697536] 0 reader [140484793304832] reader [reader [140484784912128140484793304832] reader [140484784912128] 0 ] 0 reader [140484759734016] reader [140484759734016] 0 reader [140484776519424] 此时就出现了写者饥饿问题写者无法访问临界资源饿死了 我们可以根据自己的需求进行设置读写锁的属性 int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref); /* pref 共有 3 种选择 PTHREAD_RWLOCK_PREFER_READER_NP (默认设置) 读者优先可能会导致写者饥饿情况 PTHREAD_RWLOCK_PREFER_WRITER_NP 写者优先目前有 BUG导致表现行为和 PTHREAD_RWLOCK_PREFER_READER_NP 一致 PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 写者优先但写者不能递归加锁避免死锁 */下面是一个示例 pthread_rwlock_t rwlock;//锁 pthread_rwlockattr_t attr;//属性 pthread_rwlockattr_init(attr);//初始化属性 pthread_rwlockattr_setkind_np(attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);//设置锁的属性为写者优先 pthread_rwlock_init(rwlock, attr);//初始化并设置读写锁的属性2.3 代码 #include iostream #include unistd.h #include pthread.h using namespace std;volatile int board 0;//临界资源pthread_rwlock_t rw;//全局读写锁void *reader(void* args) {const char *name static_castconst char *(args);cout reader [pthread_self() ] endl;//sleep(1);while(true){pthread_rwlock_rdlock(rw);cout reader [pthread_self() ] board endl;pthread_rwlock_unlock(rw);usleep(110);} }void *writer(void *args) {const char *name static_castconst char *(args);//sleep(1);while(true){pthread_rwlock_wrlock(rw);board;cout writer [ pthread_self() ] endl;pthread_rwlock_unlock(rw);usleep(100);} }int main() {pthread_rwlock_init(rw, nullptr);pthread_t r1,r2,r3,r4,r5,r6, w1,w2;pthread_create(r1, nullptr, reader, (void*)reader);pthread_create(r2, nullptr, reader, (void*)reader);pthread_create(r3, nullptr, reader, (void*)reader);pthread_create(r4, nullptr, reader, (void*)reader);pthread_create(r5, nullptr, reader, (void*)reader);pthread_create(r6, nullptr, reader, (void*)reader);pthread_create(w1, nullptr, writer, (void*)writer);pthread_create(w2, nullptr, writer, (void*)writer);pthread_join(r1, nullptr);pthread_join(r2, nullptr);pthread_join(r3, nullptr);pthread_join(r4, nullptr);pthread_join(r5, nullptr);pthread_join(r6, nullptr);pthread_join(w1, nullptr);pthread_join(w2, nullptr);pthread_rwlock_destroy(rw);return 0; }运行结果如下 reader [140067523458816] 7086 reader [140067548636928] 7086 writer [140067515066112] writer [140067506673408] reader [140067540244224] 7088 reader [140067565422336] 7088 reader [140067557029632] 7088 reader [140067531851520] 7088 reader [140067523458816] 7088 writer [140067515066112] writer [140067506673408] reader [140067548636928] 7090 writer [140067515066112] reader [140067523458816] 7091 writer [140067506673408] reader [140067548636928] 7092 reader [140067557029632] 7092可以看到读者的线程较多且能够正确读取数据。 如果在读者的whiile中加上sleep(10) void *reader(void* args) {const char *name static_castconst char *(args);cout reader [pthread_self() ] endl;while(true){pthread_rwlock_rdlock(rw);cout reader [pthread_self() ] board endl;sleep(10);//睡pthread_rwlock_unlock(rw);usleep(110);//避免出现只有一个线程工作} }能够看到多个读者之间不冲突不会出现读者A申请锁后读者B就无法访问临界区的情况。如果是互斥锁读者A申请之后进入休眠B就无法申请该锁。
http://www.dnsts.com.cn/news/90360.html

相关文章:

  • 怎样做易支付网站东莞设计院
  • 古装摄影网站建设方案网站开发合同变更
  • 为何建设银行的网站登不上去秦皇岛哪里做网站
  • 开发区建设集团网站代理平台软件
  • 点开文字进入网站是怎么做的优势的seo网站优化排名
  • 北京正规网站建设公司dreawever如何做本地网站
  • 阿图什网站wordpress 插件下载站
  • 网站创建桌面快捷方式wordpress 写入权限
  • 调整网站模板大小安徽搜索引擎优化seo
  • 网站快照怎么更新建设网站的实验目的
  • 教育网站的开发与建设论文自媒体135网站免费下载安装
  • 网站建设公司词中企动力是国企性质吗
  • a站下载安装wordpress the content
  • 手机设计logo软件扬州抖音seo
  • 网站建设需求公司内部调查招标网站排名
  • 网站建设企业网站界面设计甘肃政务服务网
  • 网站如何做微信分享推广可信的品牌网站建设
  • 莆田网站开发公司电话php网站运行很慢
  • 如何更改网站源码青岛建设网站
  • 营销型网站建设平台怎样帮人做网站挣钱
  • 深圳网站建设商家外贸如何推广
  • 网站后台分模块建湖人才网招工
  • php网站开发 学习计划桂林二手房
  • 长丰县住房和城乡建设局网站做网站的资料
  • 建设银行报考网站建设网站的机构
  • 市场营销毕业后找什么工作重庆seo务
  • 崇信网站建设用竹片做的网站
  • 不收费的企业查询网站软件开发交易平台
  • 网站开发的比较蚌埠网络推广
  • c 可以做网站什么是网站前台静态化