一起talk C栗子吧(第一百一十一回:C语言实例--线程间通信)
各位看官们,大家好,上一回中咱们说的是线程标识符的例子,这一回咱们说的例子是:线程间通信。闲话休提,言归正转。让我们一起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的修改,因此,如果想在进程之间传递数据,需要专门的通信方式来进行通信。
看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以下载使用。
各位看官,关于生产者与消费者问题的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
下一篇: JavaScript关于对话框的使用讲解
推荐阅读
-
一起talk C栗子吧(第一百八十四回:C语言实例--在printf函数中设置输出宽度三)
-
一起talk C栗子吧(第一百九十六回:C语言实例--DIY less命令五 )
-
一起talk C栗子吧(第一百六十二回:C语言实例--套接字知识体系图)
-
一起talk C栗子吧( 第一百四十回:C语言实例--文件操作:基于文件描述符三)
-
一起talk C栗子吧(第一百四十三回:C语言实例--文件操作:基于文件指针三)
-
一起talk C栗子吧(第一百三十九回:C语言实例--文件操作:基于文件描述符二)
-
一起talk C栗子吧(第一百三十八回:C语言实例--文件操作:基于文件描述符一)
-
一起talk C栗子吧(第一百四十一回:C语言实例--文件操作:基于文件指针一)
-
一起talk C栗子吧(第一百四十二回:C语言实例--文件操作:基于文件指针二)
-
一起talk C栗子吧(第一百六十回:C语言实例--套接字通信模型二)