程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-關於線程的幾個問題,望大神不吝賜教

c語言-關於線程的幾個問題,望大神不吝賜教

編輯:編程綜合問答
關於線程的幾個問題,望大神不吝賜教

1、雙線程,對一個公共區間讀寫時,需要加鎖,即一個線程“寫”完後再由另一個線程“讀”,不斷循環。那這種方式與另外一種方式有什麼區別:在一個main函數中寫一個(死)循環,循環內先安排“寫”程序,再安排“讀”程序,不使用線程。

2、做TCP全雙工通信時(例如語音對話),發送和接收數據在分別用一個線程實現,兩個線程沒有公共區間。那這種方式和另外一種區別有什麼不同:在一個main函數中寫一個(死)循環,循環內先安排“發”程序,再安排“收”程序,不使用線程。

3、c語言中,線程創建用pthread_create,此要傳輸參數時用最後一個參數。問題是:如果要傳多個參數時,可以用結構體,但也可以把參數設成全局變量,這兩種方式又有什麼不同。

以上3個問題,每種情況都是可以實現的,我想請教的是他們之間的區別,望大神們不吝賜教,感謝!

最佳回答:


第一點:如果是兩個線程,那麼在有互斥鎖的情況下,一個線程A先獲得資源,當他的操作沒有完成是,另一個線程B想要去獲得資源,這個時候B就會被掛起,相當於睡覺了,具體的系統機制有點復雜,涉及到CPU時間片,進程內線程的切換。如果是一個MAN函數,裡面有兩個子函數,一個讀一個寫,MAN按順序調用它。那麼在相當於是單線程。宏觀上看,兩種情況的結果差距不大,但是機制不同。同時要考慮的是,第一種情況存在寫的線程寫多次,或者讀的線程讀多次,另一個線程才去訪問資源的情況。第二種就完全是按程序邏輯去做。
第二點:如果是兩個線程分別負責收發,那麼和一個線程即收又發比較起來,肯定是兩個線程的速度要快。因為在實際應用中,很可能你讀寫會阻塞,如果在一個線程裡面阻塞了,那麼可能會丟失一些信息,比方你在發送的時候阻塞了,但是對端的信息不斷地到達本地,那麼接受緩沖區的數據滿了之後,如果還有數據到達,那麼就會覆蓋之前的數據。分兩個線程的話,當收或者發通道阻塞之後,另一個通道還是好的,就會比較好處理。
第三點:兩種方法的結果沒有區別,但是根據應用的情況有區別,全局變量是所有的都可以訪問的,而有時候,你的變量是個局部的,沒法設成全局,那你就需要在創建線程的時候,把這個變量通過參數傳入的方式傳入線程。

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