[Boost] ASIO學習筆記:thread及Synchronization

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

我們知道,我們無法預測thread執行的先後,這代表的是任何一個thread都有可以在任何的時間點從CPU上取得操作權。這不僅會造成cout時文字無法連續,同時在操作資料時,最害怕的情形是『同時』有多個thread去對『同一個資料』做更改,因為他會造成運算結果的錯誤。這個特性,在電腦科學裡面稱作race condition,進而導致了需要保證thread-safety的問題。 在boost裡提供了mutex機制來解決(Critical Section Problem) 一個簡單的demo: #include <boost/thread.hpp> #include <iostream> void wait(int seconds) { boost::this_thread::sleep(boost::posix_time::seconds(seconds)); } boost::mutex mutex; int gValue = 0; void thread(int i) { wait(1); mutex.lock(); gValue = gValue + i; std::cout < < “Thread :” << boost::this_thread::get_id() … Continued

[Boost] ASIO學習筆記:bind and ASIO

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

boost::bind的功用,主要是將function變成function object(functor)來當成參數傳送,其目的,最主要是用來實現系統callback的功能。以下為一個簡單的小程式: #include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <boost/thread.hpp> #include <iostream> using namespace std; boost::asio::io_service io_service; void WorkerThread(int x){ std::cout < < “Thread Start:” << x << endl; io_service.run(); std::cout << “Thread Finish:” << x << endl; } int main( int … Continued

[C++][範例]windows programming:window lock

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

關於Windows programming的基本觀念,可以參閱這裡。 這篇並不會解釋太多windows programming上的觀念,純粹只是分享過去的程式作品。在這裡可以看到的是,我怎麼對window創建的程序進行封裝以及對於loop迴圈的設計方法。本程式在執行之後會跳出一個白色的視窗佔住整個營幕並鎖定其他操作,按下F4可以逃出鎖定,其中包含以下幾個檔案:WinPro.hWinPro.cppmain.cpp:包含主程式main(),為程式的進入點 WinPro.h: #pragma once #include <iostream> #include <windows.h> #include <stdlib.h> using namespace std; #ifndef WIN_PRO #define WIN_PRO class WinPro { public: WinPro(void); ~WinPro(void); public://初始函式 bool init(); int start(int nCmdShow); public://靜態視窗函式回傳true代表結束迴圈,以正常方式離開程式 static bool frameFunc(); public://功能函式 void lockWindows(bool bLOCK); … Continued

[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

[python]python學習筆記part4

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

>>> r’\t’ =>字串前面加r代表是以原始字串來表示 \\t 使用三重引號來表示跨越數行的字串,如: ”’ xxxxxxxxxxxxxx xxxxxxxxxxxxxxx”’ 裡面內容不管輸入什麼就是什麼(就算是換行或縮排),如上面的例子就是多了一個\n >>> ‘apple’ in ‘my_apple’ ==>測試字串內容是否存在 True >>> text1 = ‘Just’ >>> text1 * 10 ‘JustJustJustJustJustJustJustJustJustJust’ >>> >>> ord(‘A’) =>查Ascii碼 65 >>> chr(65) =>由Ascii碼轉文字 ‘A’ >>> >>> name = ‘Justin’ >>> name[0] … Continued

[python]python學習筆記part3

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

input: name = input(“請輸入你的名稱:”) print: =>print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout) print(1, 2, 3, sep=”,”, end=”\n\n”) #以,作為分隔,結束時多空2行 print(1, 2, 3, file = open(“data.txt”, “w”)) #將資料寫入data.txt open回傳_io.TextIOWrapper物件 格式化字串: text = “%d %.2f %s” % (10, 0.3, “test”) int(“1″) =>形態轉換 open: open(file,mode=”r”,buffering=None,encoding=None, … Continued

[Python]Python學習筆記part2

posted in: C/C++程式設計 | 3

何謂模組?指的就是python中一個一個的.py檔 若hello.py的內容如下 import sys fileName = sys.argv[0] arr = sys.argv[1:] print(fileName) print(arr) 則執行 python python.py 111 222 可印出python.py及包含111及222的陣列 當我們執行import時,會先執行該模組中的每一行 若要只import模組中的某個變數,則可如此下指令: frome hello import arr print(arr) 當然會是空陣列,因為沒有傳入任何的參數 另外,在import之後,你會在.\__pycache__下發現 .pvc檔案 (若程式在該目錄有檔案獨寫權限的話) 這個檔案等同於C++中的.o檔,為binary code,目的是用來減少直譯的時間,增加執行的速度 (若原始碼有更改的話就再重新產生) from import指令的功用是”複制”模組中的參數 並不會影響原本參數的數值 使用dir(hello)可以得到hello模組中所有的參數名稱陣列 from hello import sys, … Continued

[Python]Python學習筆記 part1

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

首先至官網下載python安裝檔後安裝後(這裡使用3.2版本),找到安裝目錄(如:C:\Python32),並將其加入環境變數的路徑下(我的電腦->內容->進階->環境變數->系統變數->Path) =>用意在於讓dos能夠找到python的執行路徑 之後打開dos=>鍵入python後進入編譯模式 >>>print(“hello!world!); hello!world >>>print(“he\”llo!worl\’d!”); he”llo!worl’d \符號為脫逸字元 _為上次運算儲存的結果 執行: >>>for i in range(1, 4): …print(i) 如出現: indentationerror expected an indented block時,是因為Python強制程式碼縮排以維護可讀性,而上面的print(i)因為沒有縮排,所以才會造成錯誤。多空幾個空白改成以下方法即可: >>>for i in range(1, 4): … print(i) … 1 2 3 要注意的是,在打完程式之後,要連續按二個enter程式才會執行 定義function的方法: def function: print(“do something”) #do … Continued