程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第一百一十一回:C語言實例--線程間通信)

一起talk C栗子吧(第一百一十一回:C語言實例--線程間通信)

編輯:關於C語言

一起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的修改,因此,如果想在進程之間傳遞數據,需要專門的通信方式來進行通信。

看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以下載使用。

各位看官,關於生產者與消費者問題的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved