2012-06-03 83 views
2

我正在創建兩個線程thread1和thread2。線程1正在讀取模擬值,線程2應處理在線程1中讀取的模擬值並設置PWM參數。到目前爲止我所做的是,在主文件(我正在創建線程)中,我已經聲明瞭一個全局變量(用於存儲模擬值),並將指針傳遞給全局變量給兩個線程。在thread1中,存儲在全局變量和thread2中的讀取模擬值將讀取全局變量並對其進行處理。所以,我的問題是有沒有其他的方式來做到這一點?即我們有信號量,互斥等最適合這種應用程序?pthread中兩個線程之間的通信

回答

4

你的問題沒有一般的答案,這取決於你的很多用例。

pthreads的經典方法是使用互斥條件對來向讀線程發送修改值。這種情況適用於該線程大多處於空閒狀態並且只能在更改時進行工作的情況。在這裏,除了互斥體之外,還有一個條件變量可以確保你的閱讀線程在他無所事事的時候不會吃資源。

如果您的閱讀線程正在做一些永久性的工作,並且只使用該值,則會出現不同的情況:第一種情況是用互斥鎖保護變量,以確保您讀取的值不是一半通過更新,並始終保持一致。

更現代的方法是使用(或確保)您的讀寫操作是原子操作。新的C標準C11爲該接口提供接口,大多數編譯器已經將這些操作作爲擴展來實現。

+0

非常感謝您給出一個想法來思考我的需求......什麼是原子讀寫操作?它能做什麼 ?因爲我無法在google中找到它:( –

+0

例如https://www.informit.com/articles/article.aspx?p=1832575和 https://en.wikipedia.org/wiki/Linearizability –

1

我認爲這將需要一個非常基本的互斥。請參閱下面我的僞代碼:

Thread1() { 
    Mutex_lock(); 
    Process global variable; 
    Unlock_mutex(); 
} 

類似線程2 .. 我可以提供更具體的答案,如果您提供您當前的代碼。

+0

謝謝你的回覆。我已經發布了我的代碼,其他懷疑它存在於下面的鏈接中http://stackoverflow.com/questions/10860436/unexpected-output-in-pthread。 –