找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
發表文章前請先閱讀相關版規伊莉需要你的贊助和支持你準備好成為出色的版主了嗎?
mega國中fc2火影無碼流出我的英雄中字
a fathernympho t護身術道社保college doujin f按摩店

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

在店內買個飲料也會出

桃園觀音文林路 女子

[繁]迷宮飯16-

[繁]無職轉生 第二季1

[繁]轉生貴族憑鑑定技

[繁]關於我轉生變成史
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 2543|回復: 1
打印上一主題下一主題

[問題]thread 用法--小炸彈超人(物件)[複製鏈接]

帖子
82
積分
19 點
潛水值
13860 米
跳轉到指定樓層
樓主
發表於 2015-1-6 02:05 AM|只看該作者|倒序瀏覽
最近在做期末專題炸彈超人(規定要用成物件),努力查的結果是炸彈計時這個一定得用到多執行緒thread但我又還沒學過,先用以前做過的小遊戲改編測試炸彈,暫時先不考慮跑出地圖外等其他的問題
目前遇到的問題:
1.thread 本身好像是物件,所以沒辦法再直接呼叫物件的函式
2.不清楚thread.join()該放在甚麼地方
如果放在判斷炸彈結束前的位置,那在倒數計時前人物得等它做完才能繼續
...
瀏覽完整內容,請先 註冊登入會員
附件: 你需要登錄才可以下載或查看附件。沒有帳號?註冊
分享分享0收藏收藏0支持支持0

使用道具檢舉

bkmambaaaa 該用戶已被刪除
頭香
發表於 2015-1-8 11:55 PM|只看該作者
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
本帖最後由 bkmambaaaa 於 2015-1-9 12:34 AM 編輯

試試看:
  1. #include <iostream>     // cout
  2. #include <thread>       // thread, this_thread::sleep_for
  3. #include <chrono>       // chrono::seconds
  4. #include <functional>   // ref
  5. #include <mutex>        // mutex
  6. using namespace std;

  7. mutex mtx_stdout; // mutex for stdout

  8. class Bomber {
  9. protected:
  10.     int bombcount;
  11.     mutex mtx_bc; // mutex for bombcount;

  12. public:
  13.     Bomber() : bombcount(0) {}
  14.     void boom();
  15.     void bomb_print();
  16.     static void time(Bomber &b);
  17. };

  18. void Bomber::boom() {
  19.     if(0==bombcount) {
  20.         mtx_bc.lock();
  21.         ++bombcount;
  22.         mtx_bc.unlock();
  23.      
  24.         mtx_stdout.lock();
  25.         cout << "Bomb set...bombcount = " << bombcount << '\n';
  26.         mtx_stdout.unlock();

  27.         thread (time,ref(*this)).detach();
  28.     }   
  29. }

  30. void Bomber::bomb_print() {
  31.     mtx_bc.lock();
  32.     --bombcount;
  33.     mtx_bc.unlock();

  34.     mtx_stdout.lock();
  35.     // do some printing here...
  36.     cout << "BOOM! bombcount = " << bombcount << '\n';
  37.     mtx_stdout.unlock();
  38. }

  39. void Bomber::time(Bomber &b) {
  40.     this_thread::sleep_for(chrono::seconds(3));

  41.     b.bomb_print();
  42. }

  43. int main() {
  44.     Bomber b;
  45.     b.boom();

  46.     for(;;) {} // infinite loop
  47. }
複製代碼
1. thread 可以丟進一個 static member function,如我的例子。另外,你可以用 std::ref 把自身物件包起來傳進 thread 和 static member function 之內,這樣就可以在內部使用物件的成員。

2. join() 是母 thread 要等子 thread 才需要呼叫,意思是暫停一切動作,等待子 thread 完成。因為放下炸彈後,你應該還可以走來走去,所以母 thread 不需要等子 thread,直接呼叫 detach() 切斷關係,讓子 thread 獨立運作,完成自己釋放資源。

建議加上 mutex 的使用。你的 bombcount 會被多個 thread 存取,所以最好存取前保護起來。另外標準輸出裝置(螢幕的 console 畫面)也最好用全域的 mutex 保護起來。

先這樣,有問題再說。

附帶一題 thread 是 c++11 的功能,其他版友如果要編譯需要用 VS 2012 以後的,或者其他比較新的編譯器。
...
瀏覽完整內容,請先 註冊登入會員
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部