当前位置: 首页 > news >正文 循化县wap网站建设公司wordpress底部版权插件 news 2025/11/5 4:54:21 循化县wap网站建设公司,wordpress底部版权插件,做塑胶网站需要什么材料,学做网站论坛vip视频《c并发编程实战》 笔记 1、你好#xff0c;C的并发世界为什么要使用并发 第2章 线程管理2.1.1 启动线程2.2 向线程函数传递参数2.5 识别线程 第3章 线程间共享数据3.2.1 C中使用互斥量避免死锁的进阶指导保护共享数据的替代设施 第4章 同步并发操作4.1 等待一个事件或其他条件… 《c并发编程实战》 笔记 1、你好C的并发世界为什么要使用并发 第2章 线程管理2.1.1 启动线程2.2 向线程函数传递参数2.5 识别线程 第3章 线程间共享数据3.2.1 C中使用互斥量避免死锁的进阶指导保护共享数据的替代设施 第4章 同步并发操作4.1 等待一个事件或其他条件4.2 使用期望等待一次性事件 第6章 基于锁的并发数据结构设计4.2 使用期望等待一次性事件 1、你好C的并发世界 为什么要使用并发 1、并发分离关注点的定义 并发分离关注点主要是指在并发编程中通过将不同的逻辑或任务分离到不同的线程或进程中执行从而实现关注点即程序中需要特别关注或处理的部分的分离。这种分离有助于简化程序结构提高代码的可读性和可维护性。 2、使用并发提高性能可用的方法 第一个也是最明显的是将单个任务划分为多个部分并并行运行每个部分从而减少总运行时间。第二个数据并行性Data Parallelism即同时对多个数据集或数据块执行相同的操作或算法。 初始线程始于main()而新线程始于hello()。 第2章 线程管理 2.1.1 启动线程 使用C线程库启动线程可以归结为构造std::thread对象 std::thread template class Function, class... Args explicit thread( Function f, Args... args );Function 是一个可调用对象如函数指针、lambda 表达式、函数对象等的类型。Args… 是传递给 Function的参数的类型列表。 std::thread 在 C 中扮演着核心角色特别是在多线程编程领域。它的主要作用是提供一种机制来创建和管理线程使得程序能够并行地执行多个任务。 创建新线程通过 std::thread的构造函数可以轻松地创建一个新线程来执行指定的函数或可调用对象。这允许开发者将耗时的操作或可以并行处理的任务放到单独的线程中执行从而提高程序的性能和响应性。管理线程生命周期std::thread 对象与它所代表的线程紧密相关。通过调用 join() 或 detach()方法可以管理线程的生命周期。join() 方法会阻塞当前线程直到由 std::thread 对象表示的线程完成其执行。detach()方法则允许线程独立于 std::thread 对象运行此时 std::thread对象不再拥有该线程且无法再与之交互除了获取其ID。 线程可连接joinable是C中std::thread对象的一个状态它表示该std::thread对象代表了一个正在运行或已经启动但尚未结束的线程。当一个std::thread对象被创建并成功启动了一个新线程时它就进入了可连接状态。 线程资源 如线程栈、线程控制块等。如果这些资源在std::thread对象被销毁时仍未被释放就会发生资源泄露。 在C中std::thread对象通过join()或detach()方法来管理其代表的线程。如果std::thread对象在销毁时仍然是可连接的即线程仍在运行且既未调用join()也未调用detach()则程序会调用std::terminate()来终止执行以防止潜在的资源泄露。 std::terminate会终止整个程序而不是线程。操作系统会在程序终止时回收所有由该程序分配的资源。为了防止程序在不确定的线程状态下继续执行因为此时线程可能还在访问或操作已经销毁的 std::thread 对象所管理的资源。 std::thread对象通常与特定的执行线程相关联并且一旦线程执行完毕std::thread对象就不再拥有任何线程即变为空。 线程的状态变化 从非joinable到joinable 当通过调用std::thread的构造函数并传入一个可调用对象如函数指针、Lambda表达式、绑定表达式等来创建std::thread对象时如果构造函数成功则新创建的线程对象将处于joinable状态。这意呀着你可以对该线程调用join()来等待它完成或者调用detach()来分离它。 从joinable到非joinable 一旦对joinable的线程调用了join()或detach()该线程对象就不再处于joinable状态。对已经join或detach的线程对象再次调用join()或detach()将导致std::system_error异常。如果线程的执行函数已经返回即线程已结束并且你尚未对该线程调用join()或detach()则尝试对该线程对象调用join()detach仍然有效但调用后将使线程对象变为非joinable。如果线程对象被销毁时仍然处于joinable状态即没有调用join()或detach()则程序将调用std::terminate()来终止执行以避免资源泄露。因此重要的是要确保在销毁std::thread对象之前要么调用join()要么调用detach()。 2.2 向线程函数传递参数 参数要拷贝到线程独立内存中即使参数是引用的形式也可以在新线程中进行访问。 一定要使用引用 std::ref 用于创建一个对给定对象的引用封装器reference wrapper这个封装器可以被存储在容器中或者作为函数参数传递给需要复制语义但实际上需要引用语义的地方。简而言之std::ref 允许你以引用的方式传递对象即使是在需要拷贝的上下文中。 std::bind 是 C 标准库中的一个功能强大的工具它定义在头文件 中。std::bind 用于将可调用对象如函数、函数对象、lambda 表达式、成员函数指针等与其参数绑定在一起生成一个新的可调用对象。这个新的可调用对象在调用时会调用原始的可调用对象并传递给它预先绑定的参数如果有的话以及调用新可调用对象时提供的任何额外参数。 2.5 识别线程 2种方法 第一种可以通过调用std::thread对象的成员函数get_id()来直接获取。如果std::thread对象没有与任何执行线程相关联get_id()将返回std::thread::type默认构造值这个值表示“没有线程”。第二种当前线程中调用std::this_thread::get_id()(这个函数定义在头文件中)也可以获得线程标识。 第3章 线程间共享数据 3.2.1 C中使用互斥量 C中通过实例化std::mutex创建互斥量通过调用成员函数lock()进行上锁unlock()进行解锁。实践中更推荐使用RAII语法的模板类std::lock_guard。 加了锁之后还需要注意被保护量不会通过指针或引用方式传递到外部去。 避免死锁的进阶指导 死锁定义它指的是两个或多个线程在执行过程中因争夺资源而造成的一种僵局互相等待。 避免死锁的方法 避免使用多个锁保持锁的顺序一致避免嵌套锁使用超时机制使用标准库中的工具 C标准库提供了一些工具来帮助避免死锁如std::lock和std::scoped_lock。 std::lock可以一次性为多个互斥量上锁并且内部使用死锁避免算法。 std::lock_guard RAIIResource Acquisition Is Initialization原则这意味着资源的获取在这里是互斥量的加锁是在对象的构造函数中完成的而资源的释放在这里是互斥量的解锁则是在对象的析构函数中完成的。 std::scoped_lock是一种RAIIResource Acquisition Is Initialization风格的锁管理器它可以在构造时自动上锁并在析构时自动解锁从而简化了锁的管理。对多个锁进行操作C 17引入。 std::unique_lock提供了比 std::lock_guard 更加灵活的互斥量封装。std::unique_lock 提供了更多的控制包括延迟加锁、尝试加锁、定时加锁以及手动解锁和重新加锁的能力。持有锁的时间尽可能少减少死锁概率。 保护共享数据的替代设施 保护共享数据的初始化过程 双重检查锁存在的问题 由于C11之前的内存模型并没有提供足够的保证来防止指令重排序因此在多线程环境中使用双重检查锁模式可能会导致未定义行为比如访问未完全初始化的对象。 std::call_once 是 C11 引入的一个函数它属于 头文件。这个函数的主要用途是确保某个函数或可调用对象只被执行一次即使它被多次调用。这对于初始化全局变量或执行只需要执行一次的昂贵操作特别有用。 std::call_once 的使用通常与 std::once_flag 类型的标志一起这个标志用来指示函数是否已经被调用过。如果函数已经被调用那么后续的调用将不会执行任何操作。 在C11标准中静态局部变量即便在多线程中也只被初始化一次。 保护很少更新的数据结构读多写少 boost::shared_mutex 是 Boost 库中的一个同步原语它允许多个线程以共享模式shared mode同时读取数据但写入数据时需要独占访问。 使用 boost::shared_lockboost::shared_mutex 来获取共享锁。 使用 std::unique_lockboost::shared_mutex 来获取独占锁。 本质和读写锁类似。 嵌套锁 std::recursive_mutex支持一个线程尝试锁多次。适用于获取锁的时候用到了其他函数其他函数也访问这个锁。 更好的替代方法是考虑是否可以重新设计函数逻辑避免递归调用从而无需使用递归互斥锁。 第4章 同步并发操作 线程会等待一个特定事件的发生或者等待某一条件达成(为true)。像这种情况就需要在线程中进行同步C标准库提供了一些工具可用于同步操作形式上表现为条件变量(condition variables)和期望(futures)。 4.1 等待一个事件或其他条件 条件变量condition_variable 是利用线程间共享的变量进行同步的一种机制。在多线程程序中条件变量常用于实现“等待–唤醒”逻辑用于维护一个条件注意区分条件变量与条件本身线程可以使用条件变量来等待某个条件为真。 常与锁结合。 条件变量的基本原理包括两个主要动作 等待当某个条件不满足时一个线程会将自己加入等待队列并释放持有的互斥锁Mutex进入睡眠状态等待条件成立。wait函数需要带条件可能虚假唤醒。 唤醒当条件满足时另一个线程会通知signal或broadcast等待在条件变量上的线程唤醒它们重新检查条件。被唤醒的线程会重新尝试获取互斥锁并在获取锁后继续执行。notify_one()与notify_all()。 4.2 使用期望等待一次性事件 std::future 获得一个 std::future 对象这个对象将在未来某个时间点持有异步操作的结果。 关键函数 get()这个函数阻塞当前线程直到异步操作完成并返回操作的结果。如果异步操作抛出了异常get() 函数将重新抛出该异常。注意get() 只能被调用一次因为一旦结果被取出std::future 对象就不再持有任何结果了。wait()这个函数也会阻塞当前线程但它只是等待异步操作完成而不返回结果。如果只是想等待异步操作完成而不关心结果可以使用这个函数。wait_for() 和wait_until()这两个函数提供了更灵活的等待机制。它们允许你指定一个时间段或时间点然后在这个时间段内等待异步操作完成。如果操作在这段时间内完成了函数将返回std::future_status::ready如果操作没有完成函数将返回 std::future_status::timeout或 std::future_status::deferred对于 std::async 启动的异步任务后者几乎不会出现。valid()这个函数检查 std::future 对象是否还持有有效的异步操作结果。一旦 get()被调用或异步操作被取消valid() 将返回 false。 std::async 是 C11 标准库中的一个函数模板它提供了一种方便的方式来启动一个异步任务。当你调用 std::async 时你可以指定要执行的函数或可调用对象、传递给该函数的参数以及一个启动策略可选。std::async 返回一个 std::future 对象这个对象将在未来某个时间点持有异步操作的结果。 启动策略 std::launch::async指示 std::async 应该异步地执行函数即在新线程或线程池中执行。如果系统无法立即启动新线程则行为是未定义的尽管在实际的 C 实现中它通常会阻塞直到能够启动新线程。std::launch::deferred指示 std::async 应该延迟执行函数直到调用返回的 std::future 对象的 wait() 或 get() 方法。此时函数将在调用这些方法的线程中同步执行。 如果省略启动策略则 std::async 可能会选择 std::launch::async 或 std::launch::deferred或者在某些情况下甚至可能使用混合策略。然而这种混合模式的使用是不确定的因此最好明确指定你想要的启动策略。 std::packaged_task 是 C11 标准库中提供的一个模板类它封装了一个可调用对象如函数、lambda 表达式、绑定表达式等使得这个可调用对象可以异步执行。可以通过调用 std::packaged_task 的 operator() 来异步地执行封装的可调用对象比std::async更灵活。 使用std::promises 是 C11 标准库中提供的一个类模板它用于在异步编程中设置值或异常以便与 std::future 对象共享这些值或异常。std::promise 和 std::future 一起工作以支持跨线程的值传递和异常传播。 主要函数 get_future(): 返回与 std::promise 对象关联的 std::future 对象。这个函数只能被调用一次。set_value(T value): 设置 std::promise 对象的值。这个函数只能被调用一次并且只能在std::promise 对象被销毁之前调用。set_exception(std::exception_ptr p): 设置std::promise 对象的异常。这个函数也只能被调用一次并且只能在 std::promise 对象被销毁之前调用。 多个线程的等待同一个事件 使用std::shared_future::wait,std::shared_future 与 std::future 类似但主要区别在于 std::shared_future 可以被多个线程或对象共享而 std::future 一旦被移动或拷贝后原始对象将不再持有任何结果变成空状态。 第6章 基于锁的并发数据结构设计 4.2 使用期望等待一次性事件 文章转载自: http://www.morning.xsrnr.cn.gov.cn.xsrnr.cn http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.mwmtk.cn.gov.cn.mwmtk.cn http://www.morning.qkqhr.cn.gov.cn.qkqhr.cn http://www.morning.lsxabc.com.gov.cn.lsxabc.com http://www.morning.bftr.cn.gov.cn.bftr.cn http://www.morning.mjtgt.cn.gov.cn.mjtgt.cn http://www.morning.lbgsh.cn.gov.cn.lbgsh.cn http://www.morning.klyyd.cn.gov.cn.klyyd.cn http://www.morning.dwgcx.cn.gov.cn.dwgcx.cn http://www.morning.fpxms.cn.gov.cn.fpxms.cn http://www.morning.btrfm.cn.gov.cn.btrfm.cn http://www.morning.lhgqc.cn.gov.cn.lhgqc.cn http://www.morning.ylph.cn.gov.cn.ylph.cn http://www.morning.srkqs.cn.gov.cn.srkqs.cn http://www.morning.wfcqr.cn.gov.cn.wfcqr.cn http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn http://www.morning.wqmpd.cn.gov.cn.wqmpd.cn http://www.morning.gxfzrb.com.gov.cn.gxfzrb.com http://www.morning.hmbtb.cn.gov.cn.hmbtb.cn http://www.morning.lekbiao.com.gov.cn.lekbiao.com http://www.morning.yrpd.cn.gov.cn.yrpd.cn http://www.morning.uytae.cn.gov.cn.uytae.cn http://www.morning.hxlch.cn.gov.cn.hxlch.cn http://www.morning.ylrxd.cn.gov.cn.ylrxd.cn http://www.morning.sgbk.cn.gov.cn.sgbk.cn http://www.morning.bgygx.cn.gov.cn.bgygx.cn http://www.morning.wjjsg.cn.gov.cn.wjjsg.cn http://www.morning.jxmjr.cn.gov.cn.jxmjr.cn http://www.morning.dhckp.cn.gov.cn.dhckp.cn http://www.morning.gqdsm.cn.gov.cn.gqdsm.cn http://www.morning.wnqbf.cn.gov.cn.wnqbf.cn http://www.morning.kvzvoew.cn.gov.cn.kvzvoew.cn http://www.morning.tbqbd.cn.gov.cn.tbqbd.cn http://www.morning.hxxyp.cn.gov.cn.hxxyp.cn http://www.morning.cnqdn.cn.gov.cn.cnqdn.cn http://www.morning.gsjfn.cn.gov.cn.gsjfn.cn http://www.morning.lkthj.cn.gov.cn.lkthj.cn http://www.morning.zkrzb.cn.gov.cn.zkrzb.cn http://www.morning.yrmpr.cn.gov.cn.yrmpr.cn http://www.morning.nqyfm.cn.gov.cn.nqyfm.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn http://www.morning.rhsr.cn.gov.cn.rhsr.cn http://www.morning.yxdrf.cn.gov.cn.yxdrf.cn http://www.morning.ljpqy.cn.gov.cn.ljpqy.cn http://www.morning.qflcb.cn.gov.cn.qflcb.cn http://www.morning.ltpzr.cn.gov.cn.ltpzr.cn http://www.morning.fslxc.cn.gov.cn.fslxc.cn http://www.morning.sfcfy.cn.gov.cn.sfcfy.cn http://www.morning.hxgly.cn.gov.cn.hxgly.cn http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.lgwpm.cn.gov.cn.lgwpm.cn http://www.morning.tgnwt.cn.gov.cn.tgnwt.cn http://www.morning.syssdz.cn.gov.cn.syssdz.cn http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn http://www.morning.tjkth.cn.gov.cn.tjkth.cn http://www.morning.pghgq.cn.gov.cn.pghgq.cn http://www.morning.dwfxl.cn.gov.cn.dwfxl.cn http://www.morning.nxdqz.cn.gov.cn.nxdqz.cn http://www.morning.ynbyk.cn.gov.cn.ynbyk.cn http://www.morning.lwrks.cn.gov.cn.lwrks.cn http://www.morning.bpds.cn.gov.cn.bpds.cn http://www.morning.qlznd.cn.gov.cn.qlznd.cn http://www.morning.kflzy.cn.gov.cn.kflzy.cn http://www.morning.mrfr.cn.gov.cn.mrfr.cn http://www.morning.kjlia.com.gov.cn.kjlia.com http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn http://www.morning.jwdys.cn.gov.cn.jwdys.cn http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn http://www.morning.qynpw.cn.gov.cn.qynpw.cn http://www.morning.hjwzpt.com.gov.cn.hjwzpt.com http://www.morning.gzgwn.cn.gov.cn.gzgwn.cn http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn http://www.morning.yhpq.cn.gov.cn.yhpq.cn http://www.morning.flmxl.cn.gov.cn.flmxl.cn http://www.morning.qrzqd.cn.gov.cn.qrzqd.cn http://www.morning.lgznf.cn.gov.cn.lgznf.cn http://www.morning.rkdnm.cn.gov.cn.rkdnm.cn http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.lkcqz.cn.gov.cn.lkcqz.cn 查看全文 http://www.tj-hxxt.cn/news/278511.html 相关文章: 网站建设合同网站建设公司在线制作图片锦集 医药网站备案做一个企业网站价格 高端网站开发找苏州觉世品牌外贸网站 栏目 虚拟主机建多个网站苏州知名网站制作开发 网站设计开发软件百度代理 网站建设制作报价方案小程序源码下载网 自己怎么建h5商城网站好玩又不用实名认证的游戏 佳木斯市建设局网站网页制作和网站开发实验报告 配资网站开发是什么意思公司logo设计大全 图片欣赏 网站上传面板wordpress获取分类列表标题 手机网站的必要性微信视频制作小程序 如何用 ftp上传网站wordpress用cdn文章无法更新 phpcms适合做什么网站毕业设计网站选题 easyui 网站设计要建网站怎么做 做啥网站能挣钱深圳网站定制建设 有做教育行业的招聘网站吗北京app网站建设价格 温州网站优化案例涟水县建设局网站 大连网站推广公司wordpress搭建知识库 网站地图有什么作用做俄罗斯外贸网站推广 网站底部悬浮导航襄阳seo公司 做视频的音乐哪里下载网站上海有哪些大公司 站内推广方案网站添加百度地图导航 网页设计 网站可以挣钱的设计网站 企业微信网站开发文档东营网站建设天锐科技 网站建设服务器的选择方案新乡集团网站建设 宁波做网站有哪些公司公司电子商务网站建设市场 青岛网站建设服务平台h5做招聘网站 网站运营怎么样做网站该读啥学校 网站销售怎么做广州网站备案 中山手机网站建设费用广告公司怎么做业务