各位看官们,大家好,上一回中咱们说的是线程标识符的例子,这一回咱们说的例子是:线程间通信。闲话休提,言归正转。让我们一起talk C栗子吧!
看官们,我们在前面章回中说过进程间通信,那么线程之间有没有通信呢?严格来说没有线程间的通信。从通信的角度来看,通信主要是发送/接收信号或者传递数据,线程与进程在这些方面是不同的,其实这是由它们的特点决定的。进程拥有自己的资源,这些资源是私有的,不能随便和其它进程共享使用,所以需要进程间的通信;而线程(这里指同一个进行创建的线程)没有自己的资源,因为线程是由同一个进程创建的,所以这些线程之间可以使用任何进程的资源,也就是说它们可以共享进程的资源,既然资源可以共享了,那么就没有必要进行通信。
接下来我们举一个实际的例子时行说明,在代码中我们定义一个全局变量data。把它当作进程和线程的共享资源,在不同的进程与线程内都修改并且显示它的值。
- data的初始值是1.
- 再父进程中将其修改为2;在子进程中将其修改为3;
- 等待子进程运行完成后,在父进程中分别创建两个线程;
- 第一个线程中把data的值修改为4;
- 第二个线程中把data的值修改为5。
- 在每个进程和线程中都显示data修改前后的值。
下面是程序的运行结果,请大家参考:
PID: 4394 -> Father Process is running //父进程在运行
the old value of data is 1
the new value of data is 2 //父进程把data的值从1修改为2
PID: 4395 -> Son Process is running //子进程在运行
the old value of data is 1
the new value of data is 3 //父进程把data的值从1修改为3
Son process finished: PID = 4395
Create first thread by 4394 //父进程创建第一个线程
The ID of thread is :3075603264
the old value of data is 2
the new value of data is 4 //第一个线程把data的值从2修改为4
first thread function running finished.
Create second thread by 4394 //第一个线程运行结束后,创建第二个线程
The ID of thread is :3075603264
the old value of data is 4
the new value of data is 5 //第二个线程把data的值从4修改为5
second thread function running finished.
从上面的运行结果中可以看到:
- 1.父进程和子进程分别拥有data,它们的初始值都为1;
- 2.父进程和子进程对data的修改互不影响。父进程将data从1修改为2;子进程将data从1修改为3;
- 3.父进程中创建了两个线程,这两个线程和父进程共享data,并且data的初始值都为2;
- 4.第一个线程修改了data的值,data的值变为4,这也影响到了第二个线程;
- 5.第二个线程读取到的data初始值为4,该值是第一个线程修改data后的值;
大家可以看到,同一个进程中的前一个线程对共享变量data修改后,该进程中的后一个线程就能直接得到前一个线程修改后值。因此线程间不需要专门的通信方式,这也就是我们说线程间没有通信的原因。相比之下,父进程修改了共享变量data的值,但是子进程看不到父进程对共享变量data的修改,因此,如果想在进程之间传递数据,需要专门的通信方式来进行通信。
看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。
各位看官,关于生产者与消费者问题的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。