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

伊莉討論區

搜索
尊貴會員無限使用任何功能尊貴會員無限下載附件你準備好成為出色的版主了嗎?
mgcosplay鬼父柯南銀魂惡靈古堡流出
stars 60mg fsdss銭湯カノ俺の妹がウトウト妹妹進擊的鑽

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

[繁]轉生為第七王子,

[繁]為美好的世界獻上

桃園觀音文林路 女子

[繁]迷宮飯16-

[繁]魔王學院的不適任

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

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

bkmambaaaa 該用戶已被刪除
樓主
發表於 2015-1-8 11:55 PM|顯示全部樓層
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php
本帖最後由 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 以後的,或者其他比較新的編譯器。
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

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

Powered by Discuz!

© Comsenz Inc.

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