2011-10-05 72 views
0

我有一個(軟)實時系統查詢一些傳感器數據,做一些處理,然後等待下一組傳感器數據。傳感器數據在接收器線程中讀取並放入隊列中,因此主線程正在「睡眠」(通過互斥鎖),直到新數據到達。實現低優先級後臺線程的模式?

還有其他一些任務,如日誌記錄或在後臺進行一些長期計算。這些被實現爲在其他線程中運行。

但是,當主線程處理傳感器數據時,它應該具有最高的優先級,這意味着其他線程應該不會消耗任何CPU資源(當前後臺線程會導致主線程以不可接受的方式減慢。)

根據Setting thread priority in Linux with Boost,有人懷疑設置線程優先級會完成這項工作。我想知道如何衡量哪些效果設置線程優先級真的具有? (平臺:Angstrom Linux,ARM PC)

有沒有辦法「完全暫停」和「繼續」線程?

C++中是否有模式可能會實現暫停/繼續我自己? (我也許能夠在後臺工作拆分成小塊,如果允許我繼續我的工作的每塊後檢查,但問題是,這些塊應該多大等)

感謝您的想法!

+0

爲什麼不只是創建接收者線程和主線程具有很高的優先級?當傳感器線程設置準備好驅動程序,它將運行使用全部CPU的,當它設置互斥鎖的主線程將與所有的CPU的運行,(當然一旦傳感器螺紋回來等待它的驅動程序) 。如果做不到這一點,你可以將部分/全部傳感器數據處理到傳感器的驅動程序? –

回答

4

你的問題是OS調度器,而不是C++。您需要有一個實時調度程序,用於在較高優先級的線程運行時阻塞較低優先級的線程。

大多數「標準」PC調度程序不是實時的。有一個適用於Linux的RT調度程序 - 使用它。首先閱讀有關SCHED_RR和SCHED_FIFO以及nice命令。

在許多系統中,你必須生成一個任務(使用fork),以確保不錯的水平和RT調度實際上是有效的,你必須通過你的系統的手冊閱讀並找出哪些調度你擁有的模塊以及它們是如何實現的。

0

有設置在提升優先級線程::沒有可移植的方法。原因是不同的操作系統會有不同的API來設置優先級(例如Windows和Linux)。

以便攜方式設置優先級的最佳方法是使用統一API在內部獲取線程native_handle編寫boost :: thread的包裝器,然後使用特定於操作系統的API(例如,在Linux中,您可以使用sched_setscheduler())。 你可以在這裏看到一個例子: https://sourceforge.net/projects/threadutility/ (我的一個學生做的代碼,看看svn庫)

+0

我應該將這個答案發布到鏈接的問題中...... – knulp