用pthread_create创建线程

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

用pthread_create创建线程 - 图1

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

用pthread_create创建线程 - 图2

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

用pthread_create创建线程 - 图3

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

看看程序能否运行。

用pthread_create创建线程 - 图4试驾

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

用pthread_create创建线程 - 图5

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

用pthread_create创建线程 - 图6

这里没有蠢问题

问:既然两个函数同时运行,为什么字母没有混在一起,而是一行一条消息?

:因为标准输出就是那样工作的,puts()会一次输出整条字符串。

问:我去掉了sleep()函数,为什么程序先显示一个函数的所有输出,然后再显示另一个函数的所有输出?

:在不调用sleep()的情况下,大多数计算机会很快地运行完代码,第一个函数将在第二个函数开始运行之前就结束。

用pthread_create创建线程 - 图7代码冰箱贴

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

用pthread_create创建线程 - 图8

用pthread_create创建线程 - 图9代码冰箱贴解答

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

用pthread_create创建线程 - 图10

用pthread_create创建线程 - 图11试驾

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

用pthread_create创建线程 - 图12

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

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

用pthread_create创建线程 - 图13脑力风暴

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