短期网站开发培训动画片制作教程

pingmian/2026/1/21 12:46:43/文章来源:
短期网站开发培训,动画片制作教程,网站开站,河南响应式官网建设哪里好条件变量属性#xff1a;使用条件变量可以以原子方式阻塞线程#xff0c;知道某个特定条件为真为止。条件变量始终与互斥锁一起使用。使用条件变量#xff0c;线程可以以原子方式阻塞#xff0c;知道满足某个条件为止。对掉件的测试时在互斥锁的保护下进行的。如果条件为假…条件变量属性使用条件变量可以以原子方式阻塞线程知道某个特定条件为真为止。条件变量始终与互斥锁一起使用。使用条件变量线程可以以原子方式阻塞知道满足某个条件为止。对掉件的测试时在互斥锁的保护下进行的。如果条件为假县城通常会给予条件变量则阻塞并于原子方式释放等待条件变化的互斥锁。如果一个线程更改了条件该线程可能会向相关的条件变量发出信号从而是一个或多个等待的线程执行以下操作唤醒再次获取互斥锁重新评估条件以下情况下条件变量可用于在进程之间同步线程线程是在可以写入的内存中分配的内存由协作进程共享调度策略可确定唤醒阻塞线程的方式对于缺省值按照优先级顺序唤醒线程。必须设置和初始化条件变量的属性然后才能使用条件变量。初始化条件变量属性使用pthread_condattr_init(3C) 可以将与该对象相关联的属性初始化为其缺省值。在执行过程中线程系统会为每个属性对象分配存储空间。pthread_condattr_init语法int pthread_cond_init(pthread_cond_t *ptr  , const othread_condattr_t *av);cattr 设置为NULL。将cattr 设置为NULL 与传递缺省条件变量属性对象的地址等效但是没有内存开销。使用PTHREAD_COND_INITIALIZER 宏可以将以静态方式定义的条件变量初始化为其缺省属性。PTHREAD_COND_INITIALIZER宏与动态分配具有null 属性的pthread_cond_init()等效但是不进行错误检查。多个线程决不能同时初始化或重新初始化同一个条件变量。如果要重新初始化或销毁某个条件变量则应用程序必须确保该条件变量未被使用。pthread_cond_init返回值pthread_cond_init()在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况该函数将失败并返回对应的值。EINVAL描述: cattr 指定的值无效。EBUSY描述: 条件变量处于使用状态。EAGAIN描述: 必要的资源不可用。ENOMEM描述: 内存不足无法初始化条件变量。基于条件变量阻塞使用pthread_cond_wait(3C)可以以原子方式释放mp 所指向的互斥锁并导致调用线程基于cv 所指向的条件变量阻塞。pthread_cond_wait 语法int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex);12#include pthread_cond_t cv;pthread_mutex_t mp;int ret;/* wait on condition variable */ret pthread_cond_wait(cv, mp);阻塞的线程可以通过pthread_cond_signal() 或pthread_cond_broadcast()唤醒也可以在信号传送将其中断时唤醒。不能通过pthread_cond_wait() 的返回值来推断与条件变量相关联的条件的值的任何变化。必须重新评估此类条件。pthread_cond_wait()例程每次返回结果时调用线程都会锁定并且拥有互斥锁即使返回错误时也是如此。该条件获得信号之前该函数一直被阻塞。该函数会在被阻塞之前以原子方式释放相关的互斥锁并在返回之前以原子方式再次获取该互斥锁。通常对条件表达式的评估是在互斥锁的保护下进行的。如果条件表达式为假线程会基于条件变量阻塞。然后当该线程更改条件值时另一个线程会针对条件变量发出信号。这种变化会导致所有等待该条件的线程解除阻塞并尝试再次获取互斥锁。必须重新测试导致等待的条件然后才能从pthread_cond_wait()处继续执行。唤醒的线程重新获取互斥锁并从pthread_cond_wait()返回之前条件可能会发生变化。等待线程可能并未真正唤醒。建议使用的测试方法是将条件检查编写为调用pthread_cond_wait() 的while()循环。pthread_mutex_lock();while(condition_is_false)pthread_cond_wait();pthread_mutex_unlock();如果有多个线程基于该条件变量阻塞则无法保证按特定的顺序获取互斥锁。注– pthread_cond_wait() 是取消点。如果取消处于暂挂状态并且调用线程启用了取消功能则该线程会终止并在继续持有该锁的情况下开始执行清除处理程序。pthread_cond_wait 返回值pthread_cond_wait()在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下情况该函数将失败并返回对应的值。EINVAL描述: cv 或mp 指定的值无效。解除阻塞一个线程对于基于cv 所指向的条件变量阻塞的线程使用pthread_cond_signal(3C)可以解除阻塞该线程。pthread_cond_signal语法int pthread_cond_signal(pthread_cond_t *cv);12#include pthread_cond_t cv;int ret;/* one condition variable is signaled */ret pthread_cond_signal(cv);应在互斥锁的保护下修改相关条件该互斥锁用于获得信号的条件变量中。否则可能在条件变量的测试和pthread_cond_wait()阻塞之间修改该变量这会导致无限期等待。调度策略可确定唤醒阻塞线程的顺序。对于SCHED_OTHER将按优先级顺序唤醒线程。如果没有任何线程基于条件变量阻塞则调用pthread_cond_signal() 不起作用。示例 使用pthread_cond_wait() 和pthread_cond_signal()pthread_mutex_t count_lock;pthread_cond_t count_nonzero;unsigned count;decrement_count(){pthread_mutex_lock(count_lock);while (count 0)pthread_cond_wait(count_nonzero, count_lock);count count - 1;pthread_mutex_unlock(count_lock);}increment_count(){pthread_mutex_lock(count_lock);if (count 0)pthread_cond_signal(count_nonzero);count count 1;pthread_mutex_unlock(count_lock);}pthread_cond_signal返回值pthread_cond_signal()在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下情况该函数将失败并返回对应的值。EINVAL描述: cv 指向的地址非法。示例 说明了如何使用pthread_cond_wait()和pthread_cond_signal()。在指定的时间之前阻塞pthread_cond_timedwait(3C) 的用法与pthread_cond_wait()的用法基本相同区别在于在由abstime 指定的时间之后pthread_cond_timedwait()不再被阻塞。pthread_cond_timedwait语法int pthread_cond_timedwait(pthread_cond_t *cv,pthread_mutex_t *mp, const struct timespec *abstime);123#include #include pthread_cond_t cv;pthread_mutex_t mp;timestruct_t abstime;int ret;/* wait on condition variable */ret pthread_cond_timedwait(cv, mp, abstime);123456789pthread_cond_timewait()每次返回时调用线程都会锁定并且拥有互斥锁即使pthread_cond_timedwait()返回错误时也是如此。pthread_cond_timedwait() 函数会一直阻塞直到该条件获得信号或者最后一个参数所指定的时间已过为止。注– pthread_cond_timedwait()也是取消点。示例计时条件等待pthread_timestruc_t to;pthread_mutex_t m;pthread_cond_t c;...pthread_mutex_lock(m);to.tv_sec time(NULL) TIMEOUT;to.tv_nsec 0;while (cond FALSE) {err pthread_cond_timedwait(c, m, to);if (err ETIMEDOUT) {/* timeout, do something */break;}}pthread_mutex_unlock(m);123456789101112131415pthread_cond_timedwait 返回值pthread_cond_timedwait() 在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况该函数将失败并返回对应的值。EINVAL描述: cv 或abstime 指向的地址非法。ETIMEDOUT描述: abstime 指定的时间已过。超时会指定为当天时间以便在不重新计算值的情况下高效地重新测试条件如示例中所示。在指定的时间间隔内阻塞pthread_cond_reltimedwait_np(3C) 的用法与pthread_cond_timedwait()的用法基本相同唯一的区别在于pthread_cond_reltimedwait_np()会采用相对时间间隔而不是将来的绝对时间作为其最后一个参数的值。pthread_cond_reltimedwait_np语法int pthread_cond_reltimedwait_np(pthread_cond_t *cv, pthread_mutex_t *mp,const struct timespec *reltime);123#include #include pthread_cond_t cv;pthread_mutex_t mp;timestruct_t reltime;int ret;/* wait on condition variable */ret pthread_cond_reltimedwait_np(cv, mp, reltime);12345678pthread_cond_reltimedwait_np() 每次返回时调用线程都会锁定并且拥有互斥锁即使pthread_cond_reltimedwait_np()返回错误时也是如此。pthread_cond_reltimedwait_np()函数会一直阻塞直到该条件获得信号或者最后一个参数指定的时间间隔已过为止。注– pthread_cond_reltimedwait_np()也是取消点。pthread_cond_reltimedwait_np返回值pthread_cond_reltimedwait_np()在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况该函数将失败并返回对应的值。EINVAL描述: cv 或reltime 指示的地址非法。ETIMEDOUT描述: reltime 指定的时间间隔已过。解除阻塞所有线程对于基于cv 所指向的条件变量阻塞的线程使用pthread_cond_broadcast(3C)可以解除阻塞所有这些线程这由pthread_cond_wait()来指定。pthread_cond_broadcast 语法int pthread_cond_broadcast(pthread_cond_t *cv);12#include pthread_cond_t cv;int ret;/* all condition variables are signaled */ret pthread_cond_broadcast(cv);123456如果没有任何线程基于该条件变量阻塞则调用pthread_cond_broadcast()不起作用。由于pthread_cond_broadcast() 会导致所有基于该条件阻塞的线程再次争用互斥锁因此请谨慎使用pthread_cond_broadcast()。例如通过使用pthread_cond_broadcast()线程可在资源释放后争用不同的资源量如示例 中所示。示例条件变量广播pthread_mutex_t rsrc_lock;pthread_cond_t rsrc_add;unsigned int resources;get_resources(int amount){pthread_mutex_lock(rsrc_lock);while (resources amount) {pthread_cond_wait(rsrc_add, rsrc_lock);}resources - amount;pthread_mutex_unlock(rsrc_lock);}add_resources(int amount){pthread_mutex_lock(rsrc_lock);resources amount;pthread_cond_broadcast(rsrc_add);pthread_mutex_unlock(rsrc_lock);}12345678910111213141516171819请注意在add_resources()中首先更新resources 还是首先在互斥锁中调用pthread_cond_broadcast()无关紧要。应在互斥锁的保护下修改相关条件该互斥锁用于获得信号的条件变量中。否则可能在条件变量的测试和pthread_cond_wait()阻塞之间修改该变量这会导致无限期等待。pthread_cond_broadcast 返回值pthread_cond_broadcast()在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下情况该函数将失败并返回对应的值。EINVAL描述: cv 指示的地址非法。销毁条件变量状态使用pthread_cond_destroy(3C) 可以销毁与cv 所指向的条件变量相关联的任何状态。pthread_cond_destroy 语法int pthread_cond_destroy(pthread_cond_t *cv);12#include pthread_cond_t cv;int ret;/* Condition variable is destroyed */ret pthread_cond_destroy(cv);123456请注意没有释放用来存储条件变量的空间。pthread_cond_destroy返回值pthread_cond_destroy()在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下情况该函数将失败并返回对应的值。EINVAL描述: cv 指定的值无效。唤醒丢失问题如果线程未持有与条件相关联的互斥锁则调用pthread_cond_signal() 或pthread_cond_broadcast()会产生唤醒丢失错误。满足以下所有条件时即会出现唤醒丢失问题■ 一个线程调用pthread_cond_signal()或pthread_cond_broadcast()■ 另一个线程已经测试了该条件但是尚未调用pthread_cond_wait()■ 没有正在等待的线程信号不起作用因此将会丢失仅当修改所测试的条件但未持有与之相关联的互斥锁时才会出现此问题。只要仅在持有关联的互斥锁同时修改所测试的条件即可调用pthread_cond_signal() 和pthread_cond_broadcast()而无论这些函数是否持有关联的互斥锁。生成方和使用者问题并发编程中收集了许多标准的众所周知的问题生成方和使用者问题只是其中的一个问题。此问题涉及到一个大小限定的缓冲区和两类线程(生成方和使用者)生成方将项放入缓冲区中然后使用者从缓冲区中取走项。生成方必须在缓冲区中有可用空间之后才能向其中放置内容。使用者必须在生成方向缓冲区中写入之后才能从中提取内容。条件变量表示一个等待某个条件获得信号的线程队列。示例中包含两个此类队列。一个队列(less) 针对生成方用于等待缓冲区中出现空位置。另一个队列(more) 针对使用者用于等待从缓冲槽位的空位置中提取其中包含的信息。该示例中还包含一个互斥锁因为描述该缓冲区的数据结构一次只能由一个线程访问。示例生成方和使用者的条件变量问题typedef struct {char buf[BSIZE];int occupied;int nextin;int nextout;pthread_mutex_t mutex;pthread_cond_t more;pthread_cond_t less;} buffer_t;buffer_t buffer;12345678910如示例 中所示生成方线程获取该互斥锁以保护buffer 数据结构然后缓冲区确定是否有空间可用于存放所生成的项。如果没有可用空间生成方线程会调用pthread_cond_wait()。pthread_cond_wait()会导致生成方线程连接正在等待less 条件获得信号的线程队列。less 表示缓冲区中的可用空间。与此同时在调用pthread_cond_wait()的过程中该线程会释放互斥锁的锁定。正在等待的生成方线程依赖于使用者线程在条件为真时发出信号如示例 中所示。该条件获得信号时将会唤醒等待less 的第一个线程。但是该线程必须再次锁定互斥锁然后才能从pthread_cond_wait()返回。获取互斥锁可确保该线程再次以独占方式访问缓冲区的数据结构。该线程随后必须检查缓冲区中是否确实存在可用空间。如果空间可用该线程会向下一个可用的空位置中进行写入。与此同时使用者线程可能正在等待项出现在缓冲区中。这些线程正在等待条件变量more。刚在缓冲区中存储内容的生成方线程会调用pthread_cond_signal() 以唤醒下一个正在等待的使用者。如果没有正在等待的使用者此调用将不起作用。最后生成方线程会解除锁定互斥锁从而允许其他线程处理缓冲区的数据结构。示例生成方和使用者问题生成方void producer(buffer_t *b, char item){pthread_mutex_lock(b-mutex);while (b-occupied BSIZE)pthread_cond_wait(b-less, b-mutex);assert(b-occupied BSIZE);b-buf[b-nextin] item;b-nextin % BSIZE;b-occupied;/* now: either b-occupied BSIZE and b-nextin is the indexof the next empty slot in the buffer, orb-occupied BSIZE and b-nextin is the index of thenext (occupied) slot that will be emptied by a consumer(such as b-nextin b-nextout) */pthread_cond_signal(b-more);pthread_mutex_unlock(b-mutex);}123456789101112131415161718请注意assert()语句的用法。除非在编译代码时定义了NDEBUG否则assert() 在其参数的计算结果为真(非零)时将不执行任何操作。如果参数的计算结果为假(零)则该程序会中止。在多线程程序中此类断言特别有用。如果断言失败assert()会立即指出运行时问题。assert() 还有另一个作用即提供有用的注释。以/* now: either b-occupied ...开头的注释最好以断言形式表示但是由于语句过于复杂无法用布尔值表达式来表示因此将用英语表示。断言和注释都是不变量的示例。这些不变量是逻辑语句在程序正常执行时不应将其声明为假除非是线程正在修改不变量中提到的一些程序变量时的短暂修改过程中。当然只要有线程执行语句断言就应当为真。使用不变量是一种极为有用的方法。即使没有在程序文本中声明不变量在分析程序时也应将其视为不变量。每次线程执行包含注释的代码时生成方代码中表示为注释的不变量始终为真。如果将此注释移到紧挨mutex_unlock()的后面则注释不一定仍然为真。如果将此注释移到紧跟assert()之后的位置则注释仍然为真。因此不变量可用于表示一个始终为真的属性除非一个生成方或一个使用者正在更改缓冲区的状态。线程在互斥锁的保护下处理缓冲区时该线程可能会暂时声明不变量为假。但是一旦线程结束对缓冲区的操作不变量即会恢复为真。示例给出了使用者的代码。该逻辑流程与生成方的逻辑流程相对称。示例生成方和使用者问题使用者char consumer(buffer_t *b){char item;pthread_mutex_lock(b-mutex);while(b-occupied 0)pthread_cond_wait(b-more, b-mutex);assert(b-occupied 0);item b-buf[b-nextout];b-nextout % BSIZE;b-occupied--;/* now: either b-occupied 0 and b-nextout is the indexof the next occupied slot in the buffer, orb-occupied 0 and b-nextout is the index of the next(empty) slot that will be filled by a producer (such asb-nextout b-nextin) */pthread_cond_signal(b-less);pthread_mutex_unlock(b-mutex);return(item);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12380网站建设打算住房和城乡建设部招聘

教育 教育 试卷代号: 1062 2021年春季学期期末统一考试 文学英语赏析 试题 2021年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考…

模型评测网站怎么做企查查官网查询入口

前言 前面几篇文章分别学习了多线程的基本知识和线程池使用,这篇则为项目实践和整理。 项目参考 选择了两个项目github地址,如果不方便下载可以下面留言评论私发。 1.马士兵老师的juc,讲述了多线程的基本知识线程讲解 2.基本的线程演示&am…

自已买域名做网站要多少钱wordpress主题在手机不展示

我在Python中有一个服务器/客户机套接字对。服务器接收特定的命令,然后准备响应并将其发送到客户端。在在这个问题中,我关心的只是代码中的可能的注入:如果可以要求服务器对第二个参数做一些奇怪的事情——如果对命令内容的控制不足以避免不希…

做做网站下载2023八戒电影在线观看免费7

Guava是Google开源的一个Java基础类库,它在Google内部被广泛使用。Guava提供了很多功能模块比如:集合、并发库、缓存等,EventBus是其中的一个module,本篇结合EventBus源码来谈谈它的设计与实现。 概要 首先,我们先来预…

重点实验室网站建设今天新闻摘抄十条

图像的表示 1,位数 计算机采用0/1编码的系统,数字图像也是0/1来记录信息,图像都是8位数图像,包含0~255灰度, 其中0代表最黑,1代表最白 3, 4,OpenCV部署方法 安装OpenCV之前…

江门网站建设推广公司的网站建设价格

目录 前言 一、动态树的实现 1.数据表 2.编写后端controller层 3.定义前端发送请求路径 4.前端左侧动态树的编写 4.1.发送请求获取数据 4.2.遍历左侧菜单 5.实现左侧菜单点击展示右边内容 5.1.定义组件 5.2.定义组件与路由的对应关系 5.3.渲染组件内容 5.4.通过动态…

宣城市网站集约化建设西安建公司网站

目的 Q:如何在Qt库的基础上,实现自定义控件呢? A:根据官方文档回答,就是继承需实现的控件,然后实现自定义功能。 以下是实现QListWidget控件的自定义item。 先看下最终效果是如何: listItem 主…

临沂建设工程招聘信息网站郑州网站建设 .cc

1. 什么是bug bug本意是昆虫”或“虫子”,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问 题,简称程序漏洞。 “Bug” 的创始人格蕾丝赫柏(Grace Murray Hopper),她是一位为美国海军工作的…

实名制认证网站wordpress主题git下载失败

统一建模语言(Unified Modeling Language, UML )是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。 UML 是面向对象设计的建模工具,独立于任何具体程序设计语言。 一、简介 UML 作为一…

网站为什么做优化ppt百度引擎搜索网址

Nacos与Eureka的区别详解 在微服务架构中,服务注册与发现是核心组件之一,它们允许服务实例在启动时自动注册,并且能被其他服务发现,从而实现服务之间的互相通信。Nacos和Eureka都是现代微服务体系中广泛使用的服务注册与发现工具。本文将深入分析二者的区别,并为您提供一…

槐荫区网站建设室内装修设计软件用哪个好

在今年夏天策马翻译举办的翻译讲座上,我和詹成教授交流过一个问题:詹教授讲的很多知识点和经验并不符合“信达雅”?詹教授的回答是:“信达雅”并非翻译界的标准,他自己在日常翻译工作中的标准是“快准顺”。詹教授的回…

商务网站设计服务外包公司是干什么的

📚 目录 介绍布局原理和约束盒模型布局 约束容器ConstrainedBox非约束容器UnconstrainedBox 线性布局 行row列column 弹性布局流式布局 WrapFlow 层叠布局对齐和相对定位布局构建回调 LayoutBuilder布局过程中AfterLayout布局完成后执行 本文学习和引用自《Flutte…

天津专业做网站网站内页制作

背景 > 经过检测,我们识别到您的应用,目前未适配安卓11(API30),请您关注适配截止时间,尽快开展适配工作,避免影响应用正常发布和经营。 > targetSdkVersion30 升级适配工作参考文档&am…

千万pv网站开发成本网上做网站怎么赚钱

部署网站 说好不哭 在接触serverless架构之前,我们如果想实现上线一个Web网站,就要在开发前期经过操作很多冗杂但又必须的步骤,不少小白可谓是快速的从入门到退坑。 编写代码,部署应用,部署数据库,申请域…

国外主流网站开发技术丽江建设信息网站

容器化是最近几年 DevOps 界流行的趋势,通过业务的容器化我们将创建一个完全打包、自包含的计算环境,让软件开发人员能够更加快速地创建和部署自己的应用程序。然而长期以来,由于镜像格式的限制,容器启动镜像的加载是很慢的&#…

如何制作网页跳转链接关键词seo排名公司

今日内容 1. Junit单元测试 2. 反射 3. 注解Junit单元测试: * 测试分类:1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。2. 白盒测试:需要写代码的。关注程序具体的执行流程。* Junit使…

衡水移动网站建设价格中国最好的猎头公司

随着加密数字货币的交易方式逐渐完善,杠杆交易也逐渐成为交易者获利的重要手段之一。杠杆交易可以通过借贷放大投资收益,但是也同时放大风险。 实际使用过程中有很多小白会有不少疑问:比如杠杆交易和合约交易都是放大风险,那这两…

旅游网站的建设依据和背景哪个旅游网站可以做私人定制

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

百度做网站联系电话怎么做一个好的wordpress

一、同源策略 同源策略(Same Origin Policy): 同源是指域名,协议,端口完成一致,那么这两个url就是同源。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,也是浏览器故意设置的一个功能限制。如果缺少了同源策…

商城网站建设都有哪些类型阀门行业网站怎么做

1.集合 在内存层面需要针对于多个数据进行存储。此时可以考虑的容器有:数组、集合类。 数组存储多个数据方面的特点: 数组一旦初始化,其长度就是确定的。数组中的多个元素是依次紧密排列的,有序的,可重复的。数组一…