[Boost] ASIO學習筆記:thread

posted in: ASIO, boost, C/C++程式設計, 遊戲 | 1

在前面的例子中,我們都是以single thread來執行,但在同步/非同步操作中,其實很多問題都需要multi-thread來解決,例如,多人的連線遊戲,就需要多條thread來配給每一個不同的連線。 在進行之前,我們必須要知道的是process跟thread的分別: 當我們在執行一個程式之後,就會產生一個process,這個process擁有以下二種東西: 1.自己的Memory space 2.一個以上的thread 而每一個thread又擁有以下二個東西: 1.Stack:紀錄函數呼叫路徑,以及這些函數所用到的區域變數(local variable) 2.目前CPU的狀態 由於thread有自己的stack,因此每個thread雖然共享同一個Memory space可以存取到彼此之間的物件,但卻無法存取到對方的local variable 由於thread只是多工而不是平行運算,因此OS會依照thread所設定的優先權,分配相應的時間讓其使用CPU。例如:當我們在玩遊戲的時候,遊戲程式執行後會產生一個process,而這個process中會有如播放音樂、更新畫面…等許多的任務,這時候我們可以分配不同的thread去執行並分配其優先順序 創建、分配thread及其優先順序通常是程式設計師自己要寫,當我們使用遊戲引擎如OGRE、hge等來寫遊戲的話,如果沒特別導入如boost::thread這類的函式庫的話,其實都會是single thread的程式,也就是說,我們必須讀完所有的resource才能進行遊戲,不能夠一邊讀resource一邊顯示讀檔的進度。 基本上,當一個程式開始執行的時候,他只會存在一個執行main() function的thread,使用multi-thread的重要性在於,除了他能夠做到以上的事情之外,更重要的是,由於現在的電腦都擁有1顆以上的CPU,因此我們可以更進一步的分配這些thread給不同的CPU來運算 以下展示了一個簡單的boost::thread程式: void thread(const char* name) { for (int i = 0; i < 5; ++i) { std::cout << name << std::endl; … Continued

[Boost] ASIO學習筆記:初探io_service

posted in: ASIO, boost, C/C++程式設計 | 0

ASIO的實現,其實就是基於Proactor pattern,在這裡我們先不對這個pattern做探討,等以後有機會再來談 想像io_service即是os跟我們程式之間的橋梁,當執行io_service.run()的時候,便是將系統轉移到os上,並block住原本的程式,直至所有的工作佇列完成,其是一種synchronous 模式。 只是,有時候我們並不希望程式在完成工作之後就結束,而是繼續等待是否有其他工作傳入,這時候我們就可以加入boost::asio::io_service::work work( io_service );,以便讓系統能夠持續的運行。 完整程式碼如下: #include <boost/asio.hpp> #include <iostream> int main( int argc, char * argv[] ){ boost::asio::io_service io_service; boost::asio::io_service::work work( io_service ); io_service.run(); std::cout < < “這行永遠到不了” << std::endl; return 0; } 為什麼會這樣呢?那是因為work object 提供一個work給 … Continued

[Boost] ASIO學習筆記:hello_world

posted in: ASIO, boost, C/C++程式設計 | 0

ASIO為Boost中的一套網路函式庫,全名為asynchronous input/output,如同他的名稱,這個函式庫的核心是在處理各種同步或非同步的問題。 要學習這套函式庫,其實最好是先從其官方的教學開始:http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio.html 其實寫的還蠻不錯的,再來就是可以搭配以下幾個教學:http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=2http://en.highscore.de/cpp/boost/index.html 以下為一個最簡單的asio程序: #include <boost/asio.hpp> #include <iostream> int main( int argc, char * argv[] ){ boost::asio::io_service io_service; io_service.run(); std::cout < < “Hello world!” << std::endl; return 0; } 以上程序還沒有關係到網路,主要就只是在展示我們的程式跟OS系統操作權之間的轉移而已 其中io_service為我們的程式跟operating system’s I/O services的接口而io_service.run()會將系統操作權交給OS,而我們的程式會一直block在這一行,直至所有非同步的工作已經完成 關於非同步,讓我們來看加入非同步操作情形來解釋: #include <boost/asio.hpp> #include <iostream> … Continued

[C/C++]error C2872: ‘system’ : ambiguous symbol

posted in: boost, C/C++程式設計, html | 2

會產生這個錯誤的原因,是由於function名稱跟別的library裡宣告的名稱衝到了 例如我想加入boost的file system進來使用: #include "boost/filesystem.hpp" #define BOOST_FILESYSTEM_VERSION 3 結果呼叫system時馬上就產生了這個錯誤。(因為boost的filesystem裡面已經有system這個宣告了 那麼解決方法是什麼? 很簡單,在前面加上一個name space指定就行了,如: std::system("pause"); (因為system的name space是std) ok,這樣錯誤就自動解除了 參考:http://www.boost.org/doc/libs/1_46_0/libs/filesystem/v3/doc/reference.html

[boost]字串trim與數值轉換

posted in: boost, C/C++程式設計 | 0

用下面的方法,可以把一個字串多餘的部份拿掉並將其轉成浮點數:(沒去掉後面的1的話會產生run time錯誤) string data = ” abc: 3.40 1 ” boost::trim(data);//把前面跟後面的空白去掉 boost::trim_if(data, boost::is_any_of(“abc: “));//拿掉abc: boost::algorithm::trim_right_if(data, is_any_of(” 1″));//拿掉後面的1 float value = boost::lexical_cast(data); 執行結果:3.4

[boost] regex

posted in: boost, C/C++程式設計 | 0

一直match不成功,原來是我忘了在C++裡面需要二個\\阿…(因為\在C++裡面是脫逸字元,有特殊的意義) 以下記錄一下match日期成功的方式: regex expression(“\\d{4}-\\d{2}-\\d{2}.\\d{2}:\\d{2}:\\d{2}.*”); string tmpStr = “2011-02-24 13:31:37”; cmatch what; if(regex_match(tmpStr.c_str(), what, expression)){ cout < < “match” << endl; std::string msg(what[1].first, what[1].second); std::cout<< msg.c_str() << std::endl; }