2013-04-08 212 views
1

我基本上是在ASIO文檔中基於序列化示例構建一個共享庫,我的意思是我正在編譯-shared和-fpic選項來生成一個.so文件,其中包括鉤/包裝。Boost ASIO共享庫問題

我對另一個進程運行共享庫,然後我的代碼通過庫中的構造函數(如Windows上的DLLMain)運行。

我知道我的代碼正在執行,它運行良好,直到某個點。基本上我的問題涉及到試圖把ASIO和我的網絡代碼放到另一個線程上。我使用下面的代碼來做到這一點:

asio::io_service io_service; 
server server(io_service, port); 
asio::thread t(boost::bind(&asio::io_service::run, &io_service)); 

現在,這個代碼庫中的一個構造函數中運行,是拋出一個賽格故障,我想不通爲什麼。如果我將其替換爲:

asio::io_service io_service; 
server server(io_service, port); 
io_service.run(); 

代碼運行100%的罰款,但它竊取執行的整個主題和掛鉤過程將無法運行。有人可以幫我從這裏出去嗎?我很困惑。

乾杯

+0

我懷疑,它的東西到對象的生命週期有關。您是否在asio :: thread語句之後使用t.join()? – Icarus3 2013-04-08 15:11:58

回答

1

看起來像是一生的問題。

如果下面的代碼是在庫中的函數:

void some_function() 
{ 
    asio::io_service io_service; 
    server server(io_service, port); 
    asio::thread t(boost::bind(&asio::io_service::run, &io_service)); 
} 

然後當函數返回時,io_service會走出去的範圍,被破壞而新產生的線程試圖處理事件循環。考慮改變它,這樣的io_serviceserver壽命至少延伸到了線的持續時間:

void server_run() 
{ 
    asio::io_service io_service; 
    server server(io_service, port); 
    io_service.run(); 
} 

... 

asio::thread t(&server_run);