AI Academy
促销
CodeGym University
学习
课程
任务
调查 & 测验
游戏
帮助
日程
社区
Users
论坛
聊天
文章
成功故事
动态
评价
订阅
浅色主题
课时
评论
关于我们
开始
开始学习
立即开始学习
我的进度
课程
任务地图
课程
C++
C++
执行流与并发风险
C++ SELF
等级 68,
课时 0
我们来分析当出现第二个线程时程序发生了什么:为什么事件顺序变得不确定、
race condition
与
data race
有何不同,以及为什么
UB
并不是“罕见的 bug”,而是超出语言规则的行为。通过
std
::
thread
、
join
()
、共有变量和
++
counter
的示例,我们学习如何设计最小安全的数据所有权契约。
std::thread — 启动线程、参数、join
C++ SELF
等级 68,
课时 1
解析 C++ 中线程的基本使用:如何用函数和 lambda 启动
std::thread
,参数如何传递(拷贝,通过
std::ref
/
std::cref
引用,使用
std::move
移动),
join()
保证了什么,如何使用
joinable()
,为什么忘记
join()
会导致
std::terminate
,并通过小项目
TextStats
巩固所有内容。
为什么 detach() 危险:对象生命周期与“丢失的线程”
C++ SELF
等级 68,
课时 2
我们来分析为什么对
std::thread
调用
detach()
经常会把线程变成“丢失的线程”:你失去了结束点(
join()
),由于通过引用捕获(
[&]
)和对
this
的捕获,会产生生命周期错误(
lifetime
),并且这还会损害架构和调试。实践中我们看一个小项目
TaskBook
,比较两种方法:detached 的拷贝与通过
join()
诚实等待。
std::jthread 与 std::stop_token
C++ SELF
等级 68,
课时 3
解析为何在 C++20/23 中出现了
std::jthread
和
std::stop_token
:
jthread
如何通过
RAII
将线程的管理“默认变得安全”,它与
std::thread
有何区别,如何通过
request_stop()
与
stop_requested()
实现协作式停止,以及为什么“停止”是一个协议,而不是杀死线程。最后 — 带有 spinner 的实用示例与常见错误分析。
共享数据概念:什么算作共享资源,以及…
C++ SELF
等级 68,
课时 4
我们来解析在多线程 C++ 中应当把哪些东西视为“共享数据”:不仅是内存中的变量,还包括类似
std::cout
的输入/输出、文件、外部服务,甚至事件的顺序。学习从所有权协议开始做同步,使用通过
join()
的交换边界,借助
snapshot
复制和
thread confinement
避免共享访问,以及为何用于停止更应该使用
std::stop_token
,而不是“共享”的
bool
。
Please enable JavaScript to continue using this application.