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

网站建设源文件网站项目计划书模板范文

网站建设源文件,网站项目计划书模板范文,wordpress linux 配置,沭阳哪里有做网站推广的多线程同步 概述信号量示例一代码实现运行结果分析示例二开发环境代码实现运行结果分析future和promise示例一实现代码运行结果分析示例二实现代码运行结果示例三实现代码运行结果示例四示例代码运行结果注意附加示例扩展实现代码运行结果注意扩展原子应用场景头文件示例实现代… 多线程同步 概述信号量示例一代码实现运行结果分析 示例二开发环境代码实现运行结果分析 future和promise示例一实现代码运行结果分析 示例二实现代码运行结果 示例三实现代码运行结果 示例四示例代码运行结果注意附加示例扩展实现代码运行结果注意扩展 原子应用场景头文件示例实现代码运行结果分析 概述 本位承接上一篇多线程同步(上),接着讲解剩下的C++多线程同步的三种方式:信号量、future和promise,原子操作。 信号量 在C++中,信号量(semaphore)是一种同步机制,用于控制多个线程对共享资源的访问。信号量通常用于限制对共享资源的并发访问数量,或者用于实现线程之间的同步。 信号量的工作原理类似于一个计数器,它维护着一个整数值。当一个线程需要访问共享资源时,它会尝试获取信号量。如果信号量的值大于零,那么线程将信号量的值减一,并继续执行。如果信号量的值为零,那么线程将被阻塞,直到信号量的值大于零为止。 当一个线程完成对共享资源的访问后,它会释放信号量,即将信号量的值加一。这允许其他等待的线程获取信号量并访问共享资源。 示例一 因为C++11及其标准库中并没有提供原生的信号量类。但C++20特性中提供了信号量类。 在C++20之前,C++标准库没有提供原生的信号量类。相反,开发者通常使用std::condition_variable和std::mutex来模拟信号量的行为,或者依赖第三方库或平台特定的实现来获取信号量的功能。 代码实现 信号量实际上应用计数的原理,用于控制对共享资源的并发访问数量。它允许一定数量的线程同时访问资源,当达到这个数量时,其他尝试获取资源的线程将会被阻塞,直到有线程释放了资源。 需设置可供访问共享资源的最大线程数量,每有一个线程访问,信号量就减一,访问结束后加一。在这个过程中若是信号量的个数为0,则要访问的线程会被阻塞,等待其它正在访问的线程结束后,信号量加一,信号量不为0时才可访问。 下面是使用条件变量和互斥锁实现的信号量。 #include iostream #include thread #include mutex #include condition_variableusing namespace std;const int g_n = 3; mutex g_mutex; condition_variable g_cond; int g_count = 0;void increase() {for (int i = 0; i 5; ++i) {unique_lockmutex lock(g_mutex);g_cond.wait(lock, [] {return g_count g_n; });++g_count;cout "increase" g_count endl;g_cond.notify_all();} }void decrease() {for (int i = 0; i 5; ++i) {unique_lockmutex lock(g_mutex);g_cond.wait(lock, [] {return g_count 0; });cout "decrease:" g_count endl;--g_count;g_cond.notify_all();} }int main() {thread t1(decrease);thread t2(increase);t1.join();t2.join();cout "主线程的id:" this_thread::get_id() endl;return 0; }运行结果 分析 这里使用互斥锁和条件变量来模拟信号量。加计数中当g_count g_n,即g_count 的数值大于3的时候阻塞等待,释放锁。加计数线程处理函数释放锁之后,减计数线程处理函数开始获取锁,当g_count 0,即g_count的值大于0,继续向下执行。相反g_count 的值小于等于0则减计数线程处理函数阻塞等待,释放锁。 其中有一个环节就是当其中的一个线程处理函数被阻塞等待,另一个线程处理函数获得锁之后执行到最后会调用notify_all()来唤醒阻塞等待的线程,但这时候被唤醒的线程能不能得到锁就取决与线程,操作系统的调度策略。 下面详细分析下运行结果下的程序运行过程。 t1线程启动减计数线程处理函数,获取锁,执行到第二行wait时,由于不满足g_count 大于0的条件(g_count 此时为0),阻塞等待,并释放锁。t2线程的加计数线程处理函数获取锁,满足wait条件:g_count 小于3。不用等待继续向下执行,增加g_count 的值并输出。最后唤醒被阻塞的减计数wait,并在i=0这个循环结束为开其i=1的短暂瞬间释放锁。减计数wait被唤醒,但是没有抢到锁。只能继续等待。加计数函数继续i=1的循环,创建unique_lock获取锁,条件满足,继续向下执行。结束i=2的循环前唤醒减计数的wait,当结束本次循环,未在下次循环创建unique_lock获取锁之前,减计数函数都可以去抢锁。但实际上没有抢到锁。只能继续等待。当i =3时,加计数的wait中条件不满足(false),阻塞等待,释放锁。减计数的wait获得锁(因为之前已经被唤醒,所以减计数线程处理函数处于就绪状态,一旦有锁被释放,就会尝试获取锁),满足g_count 大于0,向下继续执行,每个循环中g_count 每次减1,当条件不再满足,就再次释放锁,阻塞等待。此时加计数因为之前已被减计数唤醒,处于就绪状态,减计数一旦释放锁,加计数就会获得锁,满足条件,向下执行。唤醒减计数,但减计数没有获得锁。直到加计数的循环次数达到5次,结束循环,释放锁。减计数获得锁,满足条件,向下执行。直到for循环结束。示例二 这个示例需要支持c++20,使用semaphore类。 开发环境 vs2019,且将项目属性设置为支持c++20。 代码实现 本例比价简单,主要是理解其如何使用,及其思想。 下面为代码: #include iostream #include thread #include semaphore//C++20 #include mutexusing namespace std;counting_semaphore g_sem(3); mutex g_mutex; #define NUM 5void fun(int i) {g_sem.acquire();g_mutex.lock();//为了输出的线程不被其它访问的线程中断cout "子线程" this_thread::get_id()"编号"i endl;g_mutex.unlock();this_thread::sleep_for(chrono::milliseconds(10));//为了模拟操作耗时g_sem.release(); } int main() {thread threads[NUM];for
http://www.pierceye.com/news/520038/

相关文章:

  • 新开传奇手游新服网谷歌seo运营
  • 新河网站建设网站空间 jsp
  • 网站视频如何下载中国建盏
  • 做网站的叫什么软件细谈电商网站外链建设的策略
  • 免费网站制作视频教程广东东莞营销
  • 女生做网站运营累不累贵州省铁路建设办公室网站
  • 全球外贸网站排名go生物网站做蛋白定位
  • 网站的规划和建设方案中教在线3d建模培训
  • 禾天姿网站开发设计上海官网
  • 个人备案后可以做电影网站吗做网站要注意哪些问题
  • 为什么我的网站在百度搜不到登封郑州网站建设
  • 中国建设部网站能查叉车证wordpress预览
  • 域名申请网页制作网站建设和外国人做古玩生意的网站
  • win7用自己ip做网站邯郸营销型网站建设
  • 织梦免费网站模块下载地址加强网站建设技术培训
  • 网站源码商城建设成都建站优化
  • 网站销售如何做业绩狗狗和人做网站
  • dede 手机站 怎么获取跳转网站安卓软件开发环境
  • 个人网站做什么类型好中国网络安全官网
  • 怎样优化网站排名上传到服务器的网站打开是空白
  • 我的世界做皮肤网站企业网站风格
  • 京东网站建设的基本情况做哪类网站赚钱
  • 淘宝上网站建设续费个人网站做什么类型的
  • 牙克石网站建设wordpress 跳过ftp
  • 中国建设银行官网站e路通下载店铺设计图纸及效果图大全
  • 福州网站推广公司烟台网络公司有哪些
  • 福建省建设注册管理中心网站那些做面点的网站好
  • 天津网站建设方案托管wordpress 批量删除
  • 网站后台管理系统域名在线设计房屋装修
  • 郑州网站建设工作室wordpress 编辑器字号