欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一起talk C栗子吧(第一百一十一回:C语言实例--线程间通信)

程序员文章站 2022-08-09 19:43:08
各位看官们,大家好,上一回中咱们说的是线程标识符的例子,这一回咱们说的例子是:线程间通信。闲话休提,言归正转。让我们一起talk 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的修改,因此,如果想在进程之间传递数据,需要专门的通信方式来进行通信。

看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以下载使用。

各位看官,关于生产者与消费者问题的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。