4.线程的同一时候运行
  接下来,我们来编写一个程序,以验证两个线程的运行是同一时候进行的。当然,假设是在一个单处理器系统上,线程的同一时候运行须要靠CPU在线程之间的高速切换来实现了。
  我们的程序须要利用一个原理:即除了局部变量外,全部其它的变量在一个进程中的全部线程之间是共享的。
  在这个程序中,我们是在两个线程之间使用轮询技术,这样的方式称为忙等待,所以它的效率会非常低。在本文的兴许部分,我们将介绍一种更好的解决的方法。
  以下的代码中,两个线程会不断的轮询推断flag的值是否满足各自的要求。
  编译这个程序:
  gcc -D_REENTRANT thread2.c -o thread2 –lpthread
  执行这个程序:
  $ ./thread2
  121212121212121212
  Waiting for thread to finish...
  5.线程的同步
  在上述演示样例中,我们?用轮询的方式在两个线程之间不停地切换是很笨拙且没有效率的实现方式,幸运的是,专门有一级设计好的函数为我们提供更好的控制线程运行和?问代码临界区的方法。
  本小节将介绍两个线程同步的基本方法:信号量和相互排斥量。这两种方法非常类似,其实,它们能够互相通过对方来实现。但在实际的应用中,对于一些情况,可能使用信号量或相互排斥量中的一个更符合问题的语义,而且效果更好。
  5.1用信号量进行同步
  1.信号量创建
  #include <semaphore.h>
  int sem_init(sem_t *sem, int pshared, unsigned int value);
  ?数说明:
  sem:信号量对象。
  pshared:控制信号量的类型,0表示这个信号量是当前进程的局部信号量,否则,这个信号量能够在多个进程之间共享。
  value:信号量的初始值。
  2.信号量控制
  #include <semaphore.h>
  int sem_wait(sem_t *sem);
  int sem_post(sem_t *sem);
  sem_post的作用是以原子操作的方式给信号量的值加1。
  sem_wait的作用是以原子操作的方式给信号量的值减1,但它会等到信号量非0时才会?始减法操作。假设对值为0的信号量调用sem_wait,这个函数会等待,直到有线程添加了该信号量的值使其不再为0。
  3.信号量销毁
  #include <semaphore.h>
  int sem_destory(sem_t *sem);
  这个函数的作用是,用完信号量后对它进行清理,清理该信号量所拥有的资源。假设你试图清理的信号量正被一些线程等待,会收到一个错误。
  与大多数Linux函数一样,这些函数在成功时都返回0。
  以下编码实现输入字符串,统计每行的字符个数,以“end”结束输入:
  编译这个程序:
  gcc -D_REENTRANT thread2.c -o thread2 –lpthread
  执行这个程序:
$ ./thread3
Input some text. Enter 'end' to finish
123
You input 3 characters
1234
You input 4 characters
12345
You input 5 characters
end
Waiting for thread to finish…
Thread join
  通过使用信号量,我们堵塞了统计字符个数的线程,这个程序似乎对高速的文本输入和悠闲的暂停都非常适用,比之前的轮询解决方式效率上有了本质的提高。