现代 C++20 实战高手课
卢誉声
Autodesk 首席工程师
3781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
现代 C++20 实战高手课
15
15
1.0x
00:00/00:00
登录|注册

18|其他重要标准库特性:还有哪些库变更值得关注?

你好,我是卢誉声。
在第二章的开头,我们曾提到过,通常意义上所讲的 C++,其实是由核心语言特性和标准库(C++ Standard Library)共同构成的。
在学习了 Ranges 库和 Formatting 库之后,还有一些比较重要的标准库变更值得我们关注,包括 jthread、source location、Sync stream 和 u8string。今天,我会带你了解它们的用法和注意事项。
好,话不多说,就让我们从 jthread 开始今天的学习之旅吧(课程配套代码可以从这里获取)。

jthread

长久以来,在 C++ 中实现多线程都需要借助于操作系统 API 或者第三方库。好在这一情况在 C++11 中得以扭转,C++11 为标准库带来了并发库,即标准的 thread 类。
但是,我们在工程中使用 C++11 的 thread 类,仍然存在一些问题。
首先是线程运行时默认行为不够灵活。thread 的内部线程是进程的子线程,当 thread 还关联着一个活动线程时,C++ 运行时会调用 terminate() 中断整个程序的执行,这种行为对于很多没有认真管理线程资源的程序,不但非常危险,而且难以追踪。
另外,thread 类还缺乏强制取消或通知取消线程的功能,在很多使用线程的场景中,这都是经常需要使用到的功能。还记得么?在第七讲至第十讲中讨论 C++ coroutines 的时候,我们就不得不自己实现了请求取消线程特性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C++20标准库带来了一系列重要变化,包括jthread、source location、Sync stream和u8string。jthread类解决了C++11标准thread类的灵活性和安全性问题,提供了默认行为的安全性,支持线程中断机制。source location标准类提供了更完整的源代码信息,对于程序跟踪调试极为有用。Sync stream解决了多线程场景下输出流对象的同步问题。而u8string引入了新的字符类型char8_t,用于描述UTF-8的字符串,解决了C++11中缺乏对utf-8字符描述方式的问题。这些变更为C++开发者带来了更便利和安全的编程体验。然而,u8string的输出仍然需要通过二进制方式输出到文件,C++标准对语言编码的支持仍有待进一步完善。总的来说,C++20标准库的更新为并发编程、调试和多线程输出等方面带来了更多便利和安全性,但在语言编码支持方面仍有改进空间。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++20 实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:pthread_create属于thread类吗? 我从网上搜到了一个安卓代码,有C++代码。线程部分,用的是pthread_create、pthread_join、pthread_exit等函数。能正常工作,但不太了解这套东西。这套东西属于C++类库中的thread类吗?还是类似于系统调用一类的API? Q2:stop_requested设置为true,但线程本身不退出,会发生什么? Q3:一个线程发送request_stop成功后,什么时候其他线程才能发送? 文中提到“一个线程发送请求成功后,其他线程调用 request_token 会失败,但不会引发异常”,发送成功后,按道理其他线程就可以发送了啊;不能发送的话,何时才能发送?

    作者回复: 1. pthread_create不属于thread类。Pthread是POSIX的Thread标准,是支持POSIX标准的系统提供的线程库,并不属于C++标准的一部分,而是属于实现部分(也就是C++标准库可能在某些支持POSIX标准的系统中使用pthread实现thread类)。 2. stop_requested设置为true,线程本身不退出不会发生什么,stop_requested只是一种线程安全的中止线程的通知手段而已。 3. 一个线程向一个jthread对象发送request_stop成功后其他的线程就不会发送成功了,因为标准中规定的就是有且只有一个线程可以发送request_stop成功,因为发送成功后stop_token就设置成true了,其他的线程再发送也就没啥意义了,你可以把request_token发送成功理解为“成功将jthread的stop_token从false修改成true”,如果stop_token本来就是true了,那肯定就不用修改了,就是发送失败。

    2023-03-04归属地:北京
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部