12.4 同时执行
接下来,我们将编写一个程序来验证两个线程的执行是同时进行的(当然,如果是在一个单处理器系统上,线程的同时执行就需要靠CPU在线程之间的快速切换来实现)。因为还未介绍到任何可以帮助我们有效地完成这一工作的线程同步函数,在这个程序中我们是在两个线程之间使用轮询技术,所以它的效率很低。同时,我们的程序仍然要利用这一事实,即除局部变量外,所有其他变量都将在一个进程中的所有线程之间共享。
实 验 两个线程同时执行
在本节中,我们创建的程序thread2.c是在对thread1.c稍加修改的基础上编写出来的。我们增加了另外一个文件范围变量来测试哪个线程正在运行。如下所示:
程序的完整代码可以在本书的网站上下载。
我们将在执行main函数时把run_now设置为1,在执行新线程时将其设置为2。
在main函数中,我们在创建新线程的语句之后添加下面的代码:
如果run_now的值为1,就打印“1”并设置它为2,否则,就稍做休息然后再检查它的值。我们不断地检查来等待它的值变为1,这种方式被称为忙等待,虽然已经在两次检查之间休息1秒钟来减慢检查的频率了。在本章的后面我们将看到对这一问题的一个更好的解决方法。
在新线程执行的thread_function函数中,我们所做的事情和上面的大部分都相同,只是把run_now的值颠倒了一下。如下所示:
我们还删除了参数的传递和返回值的传递,因为现在我们不再需要它们了。
运行这个程序时,将看到如下所示的输出结果(你可能会发现程序要过几秒钟才会产生输出,特别是在一个单核CPU的机器上)。
实验解析
每个线程通过设置run_now变量的方法来通知另一个线程开始运行,然后,它会等待另一个线程改变了这个变量的值后再次运行。这个例子显示了两个线程之间自动交替执行,同时也再次阐明了一个观点,即这两个线程共享run_now变量。