例子: 线程卸载

830 未经授权,禁止转载了解课程
课程介绍
讨论{{interaction.discussNum ? '(' + interaction.discussNum + ')' : ''}}
适合人群
具有计算机背景, 希望利用多核 CPU 进行并发编程的程序员与科研人员.
你将会学到
对并发编程有初步的理解
  • 理解 C11 标准
  • 理解什么是并发编程
  • 如何编写可移植的并发程序
  • 掌握线程的创建, 卸载, 强制完成
  • 理解互斥的使用
  • 理解条件变量
  • 原子操作
课程简介

多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个 CPU 核心在执行该程序。当一个程序运行在多线程下,就好像有多个 CPU 在同时执行该程序。


多线程比多任务更加有挑战。多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。这可能是在单线程程序中从来不会遇到的问题。其中的一些错误也未必会在单 CPU 机器上出现,因为两个线程从来不会得到真正的并行执行。然而,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的 CPU 核得到真正意义的并行执行。


如果一个线程在读一个内存时,另一个线程正向该内存进行写操作,那进行读操作的那个线程将获得什么结果呢?是写操作之前旧的值?还是写操作成功之后的新值?或是一半新一半旧的值?或者,如果是两个线程同时写同一个内存,在操作完成后将会是什么结果呢?是第一个线程写入的值?还是第二个线程写入的值?还是两个线程写入的一个混合值?因此如没有合适的预防措施,任何结果都是可能的。而且这种行为的发生甚至不能预测,所以结果也是不确定性的。


本课程将介绍 1) 如何创建与管理线程; 2) 内存顺序, 对 CPU 的执行顺序进行限制, 保持程序的正确性; 3) 原子操作, 使得原子变量在某个时刻只被一个线程访问; 4) 互斥, 对共享资源进行保护, 在某个时刻只能一个线程访问; 5) 条件变量, 如何实现多个线程的协作.


C11 是 C 语言的新标准, 它提供了新的内容, 包括线程管理, 原子操作, 互斥 (mutex), 条件变量. 该标准使得我们可以编写可移植的多线程程序.


在 Linux 下, 需要比较新的 GCC, 并且需要打开 C11 支持, -std=c11, 或者使用更新的标准, 例如 -std=c17.


展开更多
发布
头像

{{ item.user.nick_name }} {{ EROLE_NAME[item.user.identity] }}

置顶笔记
讨论图
{{ item.create_time }}回复
  • 删除

    是否确认删除?

    确认
    取消
  • {{ item.is_top == 1 ? '取消置顶' : '置顶'}}

    已有置顶的讨论,是否替换已有的置顶?

    确认
    取消
{{ tag.text}}
头像
{{ subitem.user.nick_name }}{{ EROLE_NAME[subitem.user.identity] }}
{{ subitem.create_time }}回复
删除

是否确认删除?

确认
取消
发布
{{pageType === 'video' ? '讨论区抢占沙发,可获得双倍学分' :'讨论区空空如也,你来讲两句~'}}
发布
{{tips.text}}
{{ noteHeaderTitle }} 笔记{{ hasMyNote ? '我的笔记' : '记笔记' }}
{{ hasMyNote ? '我的笔记' : '记笔记' }}
优质笔记
更新于:{{ $dayjs.formate('YYYY-MM-DD HH:mm:ss', item.last_uptime*1000) }}
头像
{{ detail.username }}

公开笔记对他人可见,有机会被管理员评为“优质笔记”

{{ noteEditor.content.length }}/2000

公开笔记
保存
提问

讲师收到你的提问会尽快为你解答。若选择公开提问,可以获得更多学员的帮助。

记录时间点
记录提问时视频播放的时间点,便于后续查看
公开提问
提交