用 pthread_create 创建线程
为了运行这两个函数,你需要进行一些设置,比如头文件和一个在程序出错时调用的
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论