我正在嘗試寫什麼應該是一個相當簡單的C++程序。這是三個部分組成:C++程序線程概念
- 串行客戶:要不斷輪詢串口服務器,並保存在一個表中接收到的值,具有無限的循環繼續查詢串行服務器
- 日誌:寫入當前表值與時間戳.csv文件每隔幾秒鐘
- 菜單:簡單的命令行菜單來啓動/停止服務器,並退出該程序
我曾嘗試使用並行線程和boost ::線程,使這個三項功能同時發生,但沒有太多運氣。
誰能爲我提供的這一切一點方向,我是新來的線程,也許線程甚至沒有去這裏的正道。
我正在嘗試寫什麼應該是一個相當簡單的C++程序。這是三個部分組成:C++程序線程概念
我曾嘗試使用並行線程和boost ::線程,使這個三項功能同時發生,但沒有太多運氣。
誰能爲我提供的這一切一點方向,我是新來的線程,也許線程甚至沒有去這裏的正道。
這裏有一種方法可以做到你的要求:
boost::mutex mtx;
void poll_thread()
{
while(!done) {
poll_for_data();
if(data_received) {
boost::unique_lock<boost::mutex> lock(mtx);
//write data to table
}
}
}
void log_thread()
{
while(!done) {
sleep(1);
boost::unique_lock<boost::mutex> lock(mtx);
//log table to csv file...
}
}
int main()
{
//create and start the polling and logging thread
boost::thread th1(&poll_thread);
boost::thread th2(&log_thread);
//run the menu
while(!done) {
//...
}
th1.join();
th2.join();
return 0;
}
互斥量是必要的,以避免在不同的線程同時訪問表。
這是一個很常見的塞納里奧。
通常你的應用程序將有一個主線程將:
然後串行連接將有聽線程。當數據在串行連接上被接收時,它將觸發一個數據接收事件,該事件將由主應用程序處理。通常,您可以使用許多可用的庫對象之一來簡化串行端口通信。這將使您無需設置和管理您的自我監聽線程。在這種情況下,您只需將您的應用事件處理程序連接到串行端口處理程序對象DataReceived事件。在C++世界中,最有可能的選擇是Boost.Asio。串口通訊對象也有很好的支持,這裏有一個很好的支持文章:CodeProject Serial library for C++。
如果事件處理程序(在串口監聽線程上調用)和主應用程序線程都訪問某些共享數據(您提到的數據表),則需要使用同步主節點保護對該對象的訪問(例如CriticalSection,Mutex ,等),以避免併發訪問(一個線程(串行監聽線程)寫入或添加到數據結構,而另一個線程(主應用程序線程)正在讀取或從中讀取)。
請發佈您嘗試過的代碼的相關部分,以便人們可以告訴您它出了什麼問題。 – Mat 2013-05-09 12:15:15
它應該使用'pthreads'。只要發佈代碼中您認爲出錯的部分。 [噓!在關閉之前要快速] – 2013-05-09 12:22:55
提升對於創建線程並不是必須的。爲什麼不使用API來創建線程? – user1764961 2013-05-09 12:42:58