返回介绍

用 pthread_create 创建线程

发布于 2024-10-10 23:21:40 字数 2163 浏览 0 评论 0 收藏 0

为了运行这两个函数,你需要进行一些设置,比如头文件和一个在程序出错时调用的

error() 函数。

现在可以开始写主函数代码了。你将创建两个线程,每个线程都需要把信息保存在一个叫 pthread_t 的数据结构中,然后就可以用 pthread_create() 创建并运行线程。

代码将以独立线程运行这两个函数。还没完,如果程序运行完这段代码就结束了,线程也会随之灭亡,因此必须等待线程结束:

pthread_join() 会接收线程函数的返回值,并把它保存在一个 void 指针变量中。一旦两个线程都结束了,程序就可以顺利退出了。

看看程序能否运行。

试驾

为了使用 pthread 库,必须在编译程序时链接它:

运行程序时,将看到两个函数同时运行:

这里没有蠢问题问:既然两个函数同时运行,为什么字母没有混在一起,而是一行一条消息?答:因为标准输出就是那样工作的,puts() 会一次输出整条字符串。问:我去掉了 sleep() 函数,为什么程序先显示一个函数的所有输出,然后再显示另一个函数的所有输出?答:在不调用 sleep() 的情况下,大多数计算机会很快地运行完代码,第一个函数将在第二个函数开始运行之前就结束。

代码冰箱贴

派对开始了,倒计数啤酒瓶数。下面这段代码运行了 20 个线程,总共有 200 万瓶啤酒。看看你能否找到丢失的代码,搞定以后干杯庆祝一下。

代码冰箱贴解答

派对开始了,倒计数啤酒瓶数。下面这段代码运行了 20 个线程,总共有 200 万瓶啤酒。请找到丢失的代码。

试驾

仔细观察刚才那个程序,当多次运行程序时会发生:

大多数情况下,代码没有把 beers 变量减为 0。

奇怪,beers 变量的初始值是 200 万,每个线程都把它的值减去 10 万,一共有 20 个线程,beers 变量不应该每次都减到 0 吗?

脑力风暴

再次检查代码。试想当多个线程在同一刻运行时会发生什么?为什么结果不可预测?为什么所有线程运行过后 beers 变量没有减到 0?把答案写在下面。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文