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

儿童故事网站建设qq浏览器收录网站提交入口

儿童故事网站建设,qq浏览器收录网站提交入口,网站下拉菜单怎么做,调用wordpress搜索代码互斥与同步 一.线程的局部存储二.线程的分离三.互斥1.一些概念2.上锁3.锁的原理4.死锁 一.线程的局部存储 例子 可以看到全局变量是所有线程共享的#xff0c;如果我们想要每个线程都单独访问g_val怎么办呢#xff1f;其实我们可以在它前面加上__thread修饰。 这就相当于把g… 互斥与同步 一.线程的局部存储二.线程的分离三.互斥1.一些概念2.上锁3.锁的原理4.死锁 一.线程的局部存储 例子 可以看到全局变量是所有线程共享的如果我们想要每个线程都单独访问g_val怎么办呢其实我们可以在它前面加上__thread修饰。 这就相当于把g_val从全局变量去储存到了局部储存里。每个线程可以单独访问自己的g_val。注意__thread只能定义内置类型 二.线程的分离 默认情况下新创建的线程是joinable的线程退出后需要对其进行pthread_join操作否则无法释放资源从而造成系统泄漏。 如果不关心线程的返回值join是一种负担(因为它会阻塞我们的主线程)这个时候我们可以告诉系统当线程退出时自动释放线程资源。 这个函数在主函数和当前线程里都可以使用。 三.互斥 1.一些概念 临界资源多线程执行流共享的资源就叫做临界资源 临界区每个线程内部访问临界资源的代码就叫做临界区。 互斥任何时刻互斥保证有且只有一个执行流进入临界区访问临界资源通常对临界资源起保护作用。 原子性后面讨论如何实现不会被任何调度机制打断的操作该操作只有两态要么完成要么未完成。 大部分情况线程使用的数据都是局部变量变量的地址空间在线程栈空间内这种情况变量归属单个线程其他线程无法获得这种变量。 但有时候很多变量都需要在线程间共享这样的变量称为共享变量可以通过数据的共享完成线程之间的交互。 多个线程并发的操作共享变量会带来一些问题。 例如一个抢票系统 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.hint ticket100; void *route(void *arg) {char *id (char*)arg;while(1) {if (ticket0) {usleep(1000);printf(%s sells ticket:%d\n, id, ticket);ticket--;} else {break;}} } int main() {pthread_t t1, t2, t3, t4;pthread_create(t1, NULL, route, (void*)thread 1);pthread_create(t2, NULL, route, (void*)thread 2);pthread_create(t3, NULL, route, (void*)thread 3);pthread_create(t4, NULL, route, (void*)thread 4);pthread_join(t1, NULL);pthread_join(t2, NULL);pthread_join(t3, NULL);pthread_join(t4, NULL);return 0; }可以看到已经抢到了负数很明显是不符合实际的。这是因为在执行打印ticket操作时操作系统需要从CPU里读取ticket数据而当一个线程已经打印了ticket0后再执行了减减操作,ticket变为了-1将ticket的值再CPU里更新这时切换到了另一个线程而该线程又恰好正要执行打印ticket操作那么它从CPU里读取了数据打印出来就为了负数。 要解决以上问题需要做到三点 1.代码必须要有互斥行为当代码进入临界区执行时不允许其他线程进入该临界区。 2.如果多个线程同时要求执行临界区的代码并且临界区没有线程在执行那么只能允许一个线程进入该临界区。 3.如果线程不在临界区中执行那么该线程不能阻止其他线程进入临界区。要做到这三点本质上就是需要一把锁。Linux上提供的这把锁叫互斥量。 2.上锁 创建锁 调用函数时可能会出现以下情况 1.互斥量处于未锁状态该函数会将互斥量锁定同时返回成功 2.发起函数调用时其他线程已经锁定互斥量或者存在其他线程同时申请互斥量但没有竞争到互斥量那么pthread_ lock调用会陷入阻塞(执行流被挂起)等待互斥量解锁。 加锁 修改代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.h #include sched.hpthread_mutex_t mutexPTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP;//初始化 int ticket100; void *route(void *arg) {char *id (char*)arg;while(1) {pthread_mutex_lock(mutex);//上锁if(ticket0) {usleep(1000);printf(%s sells ticket:%d\n, id, ticket);ticket--;pthread_mutex_unlock(mutex);//解锁} else {pthread_mutex_unlock(mutex);//解锁break;}} } int main() {pthread_t t1, t2, t3, t4;pthread_create(t1, NULL, route, (void*)thread 1);pthread_create(t2, NULL, route, (void*)thread 2);pthread_create(t3, NULL, route, (void*)thread 3);pthread_create(t4, NULL, route, (void*)thread 4);pthread_join(t1, NULL);pthread_join(t2, NULL);pthread_join(t3, NULL);pthread_join(t4, NULL);pthread_mutex_destroy(mutex);//销毁return 0; }我们发现票数问题得到了解决但是票全被一个线程抢走了这是怎么回事呢其实是由于不同线程对于锁的竞争能力是不同的这里当线程2释放锁后马上又去申请了锁导致锁一直被线程2拿着出现了线程饥饿问题。我们可以在外面加上sleep函数让每个线程释放锁后休息一段时间避免锁一直在某一个线程上。 3.锁的原理 经过上面的例子大家已经意识到单纯的 i 或者 i 都不是原子的有可能会有数据一致性问题。 为了实现互斥锁操作,大多数体系结构都提供了swap或exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于只有一条指令,保证了原子性,即使是多处理器平台,访问内存的 总线周期也有先后,一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期。 现在我们把lock和unlock的伪代码改一下。 movb语句是把al寄存器置零。 xchgb语句就是把al寄存器里的数据交换与内存里的mutex(1)变量进行一次交换此时mutex就变为了0。注意mutex是所有线程共享也就是说其实1只有一份当第一个进程将mutex里的1交换走后后面的线程就无法拿到1也就是上锁了。 4.死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 死锁的必要条件 互斥条件一个资源每次只能被一个执行流使用。 请求与保持条件一个执行流因请求资源而阻塞时对已获得的资源保持不放。 不剥夺条件:一个执行流已获得的资源在末使用完之前不能强行剥夺。 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系。避免死锁 破坏死锁的四个必要条件。 加锁顺序一致。 避免锁未释放的场景。 资源一次性分配。
http://www.hkea.cn/news/14376799/

相关文章:

  • 德阳网站建设公司建筑交流平台
  • 贵阳做网站开发的公司服务外包公司是干什么的
  • wordpress能做流量站吗哈尔滨寸金网站建设价格
  • 做网站数据库有哪些wordpress 手机端 广告
  • 东莞网站建设报价方案wordpress 获取category id
  • 合肥网站建设ahyedawordpress 文章数据
  • 微官网建设贵州seo培训
  • 网站建设专业简介企业概况的模板
  • 见网页制作的公司网站wordpress常见问题
  • 网站app免费制作软件新网站收录多少关键词
  • 备案关闭网站建设影响点金网站建设
  • 网站空间域名费wordpress 获取 图片说明
  • 众筹网站建设公司手机网站建设用乐云seo
  • 怎么做网站劳务中介红帽linux安装wordpress
  • 主播网站怎么建设设计家官网室内设计视频
  • 阿里培训网站建设石家庄学做网站建设培训学校
  • 福建福州建设局网站石家庄24号解封通知
  • 河南郑州网站制作别人用我的备案信息做网站
  • 彩票网站开发制作需要什么图片编辑器在线制作
  • 蒙icp备网站建设阿里云wordpress在哪里设置
  • 网站建设推广是什么工作wordpress未验证邮箱用户
  • 顶呱呱网站开发广东模板网站建设
  • 青岛公司做网站深圳市建设网
  • 优建网站网站上的文章经常修 内容对seo有影响吗
  • 网站开发开发公司排名北京如何优化搜索引擎
  • 潍坊网站模板在哪深圳在线直播
  • 全网营销型网站建设公司弄一个公司官网要怎么弄
  • 陕西省城乡建设厅官方网站百度快速排名培训
  • 搭建网站要不要给域名对方好玩的页游
  • 房子如何上网站做民宿动漫设计培训机构哪里好