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

网站dns修改做网站钱

网站dns修改,做网站钱,苏州建设公司,拖拽式建站源码C11多线程编程 一#xff1a;多线程概述 C11多线程编程 二#xff1a;多线程通信#xff0c;同步#xff0c;锁 C11多线程编程 三#xff1a;锁资源管理和条件变量 2.1 多线程的状态及其切换流程分析 线程状态说明#xff1a; 初始化#xff08;Init#xff09;11多线程编程 一多线程概述 C11多线程编程 二多线程通信同步锁 C11多线程编程 三锁资源管理和条件变量  2.1 多线程的状态及其切换流程分析 线程状态说明 初始化Init该线程正在被创建。就是创建thread对象并设置好回调函数该线程就处在初始化状态初始化线程的内存空间啊等这部分其实代码干预部分不多也就是从初始化到就绪态之间其实是有一个时间消耗的这就是为什么后面使用线程池来做一个处理来减少时间消耗当各种内存准备好之后就变成就绪态了         就绪Ready不代表立刻就能运行了该线程在就绪列表中等待 CPU 调度。         运行Running该线程正在运行。被CPU调度到了。         阻塞Blocked该线程被阻塞挂起。Blocked 状态包括pend(锁、 事件、信号量等阻塞)、suspend主动 pend、delay(延时阻塞)、 pendtime(因为锁、事件、信号量时间等超时等待)。阻塞态就是CPU的调度已经不再这里了放弃CPU的调度不浪费资源。         退出Exit该线程运行结束等待父线程回收其控制块资源。 2.2 竞争状态和临界区介绍 互斥锁mutex代码 竞争状态Race Condition 多线程同时读写共享数据临界区Critical Section 读写共享数据的代码片段要避免竞争状态策略 对临界区进行保护同时只能有一个线程进入临界区。   例子期望进行整块的输出如下 test 001 test 002 test 003 一共创建10个线程那么我期望每个线程输出一个这样的整块屏幕输出。写如下代码 但是最终的结果却不是想象的那样的而出现了乱码。 这时候需要加一个mutex的锁(mutex是一个互斥锁)需要包含头文件#include mutex static mutex mux; mux叫做互斥变量。资源被上锁后其他线程相当于是排队等待-阻塞mux.lock是操作系统层面的锁mux互斥锁只有这一个线程主动过来处理的时候必须先抢占锁资源所以线程它是一边抢占CPU资源一边抢占锁资源。 #include thread #include iostream #include string #include mutex //Linux -lpthread using namespace std; static mutex mux; void TestThread() {for (;;){//获取锁资源如果没有则阻塞等待//mux.lock(); //if (!mux.try_lock()) //try_lock()返回TRUE表示获得锁资源{cout . flush;this_thread::sleep_for(100ms);continue;}cout endl;cout test 001 endl;cout test 002 endl;cout test 003 endl;cout endl;mux.unlock();this_thread::sleep_for(1000ms);} } int main(int argc, char* argv[]) {for (int i 0; i 10; i){thread th(TestThread);th.detach();}getchar();return 0; } 这样就不会出现错误了每次都是整块的输出而不再有乱码了。 2.3 互斥锁的坑 线程抢占不到资源原因 理想状态当一个线程释放锁资源之后后面的线程会排队获取锁资源但是实际上有时会出现一个线程始终占领着这个资源其他线程排队永远获取不到资源的情况。 你会发现结果就是一直总是这一个或者两个线程进入而不是理想的所有的线程都能得到展示并不是我们想要的结果原因如下 这段代码中线程1获得锁资源的时候线程2和线程3处于阻塞态当线程1解锁的时候按道理2号3号线程应该有一个立即获得锁资源的但是对于线程1来说当它解锁的时候又重新进入了锁也就是解锁后自己又重新申请了锁这个锁是操作系统内核来判断这个锁资源有没有被占用掉当线程1解锁后它的内存资源当然不是立即就被释放的因为我们的操作系统不是实时操作系统从解锁再到锁之间可能就是微秒级别的而CPU调度肯定是过一段时间探测一下这个资源当线程1解锁后立即又进入了锁操作系统来不及反应操作系统会认为是线程1又抢到了锁资源实际上不是而是因为线程1的资源还没有来得及释放就又重新进入锁了所以它没有排队就再次进入了所以这就是坑的所在因此在解锁和锁之前要加一个延时给操作系统做一个释放的时间。 #include thread #include iostream #include string #include mutex //Linux -lpthread using namespace std; static mutex mux;void ThreadMainMux(int i) {for (;;){mux.lock();cout i [in] endl;this_thread::sleep_for(1000ms);mux.unlock();this_thread::sleep_for(1ms);} } int main(int argc, char* argv[]) {for (int i 0; i 3; i){thread th(ThreadMainMux, i 1);th.detach();}getchar();return 0; } 2.4 超时锁timed_mutex(避免长时间死锁)和可重入锁 mutex默认没有超时的而有线程占用的情况下其他线程是一直处于阻塞状态的这种方式代码简洁但是为后期的代码调试增加难度比如说我们不小心在代码当中写了一个死锁那你在调试当中你怎么去找到这个死锁呢每次锁之前记录一下日志看有没有进去这样的调试成本比较大不容易发现只要加了timed就支持超时。 #include thread #include iostream #include string #include mutex //Linux -lpthread using namespace std; timed_mutex tmux;void ThreadMainTime(int i) {for (;;){if (!tmux.try_lock_for(chrono::milliseconds(500))) //等待时间超过500ms就超时了{cout i [try_lock_for timeout] endl;continue;}cout i [in] endl;this_thread::sleep_for(2000ms); //假设要处理的业务的持续时间tmux.unlock();this_thread::sleep_for(1ms); //防止某一个线程一直占用这个锁资源} }int main(int argc, char* argv[]) {for (int i 0; i 3; i){thread th(ThreadMainTime, i 1);th.detach();}getchar();return 0; } 很多业务可能会用到同一个锁就会出现同一个锁被锁多次的情况如果是普通的锁的话(mutex锁)第二次锁的时候会抛出异常若没有捕获异常那么程序就会崩溃掉而这个递归锁可以进行多次上锁他会把当前线程的锁计数加一还是处于锁的状态不会改变有多少次lock就会有多少次unlock直到计数变成零的时候才真正释放可以避免不必要的死锁。  #include thread #include iostream #include string #include mutex //Linux -lpthread using namespace std; recursive_mutex rmux; void Task1() {rmux.lock();cout task1 [in] endl;rmux.unlock(); } void Task2() {rmux.lock();cout task2 [in] endl;rmux.unlock(); } void ThreadMainRec(int i) {for (;;){rmux.lock();Task1();cout i [in] endl;this_thread::sleep_for(2000ms);Task2();rmux.unlock();this_thread::sleep_for(1ms);} } int main(int argc, char* argv[]) {for (int i 0; i 3; i){thread th(ThreadMainRec, i 1);th.detach();}getchar();return 0; } 2.5 共享锁shared_mutex解决读写问题 当前线程在写数据的时候需要互斥就是其他线程既不能写也不能读。当前线程在读的时候其他线程只能读不能写。         这里面就涉及到两个锁一个读的锁一个写的锁若这个线程只读的话那我们就用一个只读的锁就可以了但是这个线程里面涉及到修改的时候需要先拿到读的锁然后再去获得写的锁然后再修改修改完之后再释放用这种方式做一个共享。         共享锁当中包含两个锁一个是共享锁一个是互斥锁只要没有人锁定互斥锁共享锁都是立即返回的只要有人锁定了互斥锁共享锁不能进其他的互斥锁也不能进。 c14 共享超时互斥锁 shared_timed_mutex(默认一般值支持到C14) c17 共享互斥 shared_mutex 如果只有写时需要互斥读取时不需要用普通的锁的话如何做 按照如下代码读取只能有一个线程进入在很多业务场景中没有充分利用 cpu 资源。 原理是如果有一个线程在写其他所有线程既不能读也不能写如果说有一个线程在读其他线程都可以读但不能写必须等待所有的读线程读完之后才能写这样就确保了资源不会被多人写而出现错误。         这就是我们要用的共享锁。读取锁一定要先释放读取锁如果锁住的话互斥锁也是进不去的。互斥锁一旦进入其他的所有读取线程都在等待。其他线程的写入锁也在等待也既同时只能有一个线程在写入。 #include thread #include iostream #include string #include mutex #include shared_mutex //Linux -lpthread using namespace std; //c17 共享锁 //shared_mutex smux;//c14 共享锁 shared_timed_mutex stmux;void ThreadRead(int i) {for (;;){//stmux.lock_shared();共享锁只要对方没有把互斥锁锁住共享锁大家都可以进去。stmux.lock_shared();cout i Read endl;this_thread::sleep_for(500ms);stmux.unlock_shared();this_thread::sleep_for(1ms);} } void ThreadWrite(int i) {for (;;){stmux.lock_shared();//读取数据stmux.unlock_shared();stmux.lock(); //互斥锁 写入cout i Write endl;this_thread::sleep_for(300ms);stmux.unlock();this_thread::sleep_for(1ms);} } int main(int argc, char* argv[]) {for (int i 0; i 3; i){thread th(ThreadWrite, i 1);th.detach();}for (int i 0; i 3; i){thread th(ThreadRead, i 1);th.detach();}getchar();return 0; }
http://www.w-s-a.com/news/372543/

相关文章:

  • vs 2015 网站开发开网店在线咨询
  • 前端如何优化网站性能大学学校类网站设计
  • 中国铁路建设投资公司网站熊学军中国it外包公司排名前50
  • 房产网站的建设广州推广排名
  • 湟源县网站建设wordpress删除未分类
  • 营销型网站开发推广厦门百度seo公司
  • 遵义网站开发培训上海中高风险地区名单最新
  • 禹州市门户网站建设做网站可以申请个体户么
  • 大良营销网站建设效果彩票网站搭建 做网站
  • 做网站的公司为什么人少了在中国如何推广外贸平台
  • 盘锦网站制作工业电商网站怎么配色
  • 白云企业网站建设seo排名点击软件
  • wordpress跨站脚本攻击漏洞国外注册的域名国内能用吗
  • 西部数码网站管理助手2工信部资质查询网站
  • 公司网站哪个建的好吉林网站制作
  • 视频网站怎么引流wordpress私人玩物
  • 我的家乡湛江网站设计新钥匙网站建设
  • 辽宁网站推广爱前端wordpress5.0.3主题
  • python怎么做网站贵阳网站制作
  • 深圳网站的优化seo网络推广有哪些
  • 网站建设实习报告范文荆州市城市建设档案馆网站
  • 网站开发信息平台项目总结企业网站如何推广
  • 网站备案名称规定手机免费h5制作软件
  • 接网站建设单子的网站网页设计尺寸多大
  • 订制型网站费用做网站的问题
  • 淮阳住房和城乡建设网站桂林新闻桂林人论坛
  • 公司网站建设价格标准老版本网站开发工具
  • 门户网站开发费怎做账做网站交互demo工具
  • 中山最好的网站建设黄村网站建设价格
  • 企业网站首页应如何布局互联网营销师证书报名入口