2008-12-10 98 views
1

我有boost :: asio庫的小問題。我的應用程序異步接收和處理數據,它創建線程並在它們中的每一個上運行io_service.run()。時間後如何檢測Asio庫的死鎖?

boost::asio::io_service io; 
boost::thread_group thread_pool; 
... 
int cpu_cnt = get_cpu_count(); 
for (int i = 0; i < cpu_cnt; ++i) 
{ 
    thread_pool.create_thread(boost::bind(&run_service, &io)); 
} 

void run_service(boost::asio::io_service* io) 
{ 
    try 
    { 
     io->run();//make fun 
    } 
    catch(const std::exception& e) 
    { //process error 
    } 
    catch(...) 
    { //process error 
    } 
} 

時間,我的應用程序從檢查是我的程序活着還是不是一些監管器應用接收消息(跨Windows消息系統)。如果我的應用程序不回覆,它將被重新啓動。這裏棘手的部分是檢查線程是否正在運行,而不是死鎖。我可以像這樣發佈處理程序到io_service:

io.post(&reply_to_supervisor); 

但該方法隻影響一個線程。 我如何檢查所有線程是否正在運行並且沒有死鎖?

回答

2

我可能是錯的,但會使用每線程io_service解決您的問題?

另一個想法:發佈cpu_cntreply_to_supervisor調用,使用一個小sleep() - 不是很好,但應該工作

0

我打算假設你的io-> run()執行某種循環來等待asio完成。我也會假設你在這個asio操作中有超時。檢查的一個骯髒的方法是讓狀態線程運行,並檢查asio線程是否等待asio完成或發佈了一個asio事件。無論哪種方式,你都會設置某種變量或句柄來知道你的線程「活着」並循環。您的狀態線程將檢查每個變量/句柄並在檢查後重置它們。

你要知道,我敢肯定還有其他的方法,但是這是浮現在腦海截至目前... =)

1

這令我的Halting Problem的實例,但因爲你似乎在Windows上,您可能需要查看Just Software Solution的just::thread庫。它是C++ 0x線程庫草案的實現,並且在其自己的互斥體中內置了死鎖檢測。

最終,雖然你可能會更好地在asio mailing list上問這個問題。圖書館的作者是非常有幫助的,他或者其他硬核asio用戶可能能夠在那裏提供更好的答案。

+1

活鎖是一樣糟糕,不是嗎? – MSalters 2009-01-05 15:49:01