用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?把答案写在下面。