各位看官們,大家好,上一回中咱們說的是線程標識符的例子,這一回咱們說的例子是:線程間通信。閒話休提,言歸正轉。讓我們一起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的修改,因此,如果想在進程之間傳遞數據,需要專門的通信方式來進行通信。
看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以下載使用。
各位看官,關於生產者與消費者問題的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。