看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) g++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) std:thread c++11 問題(Question): 最近在寫一個關於threadpool的作業 我是參考這個人的作法 https://github.com/mbrossard/threadpool/blob/master/src/threadpool.c 不過我是用std:thread, not pthread 我設計的方式就如下: 建立一個class threadpool 在constructor裡面spawn n個thread 然後讓這n個thread去執行一個infinite loop loop裡要做的事情就是檢查task_queue裡面是否有未完成的工作 若有就把工作完成 若無就繼續在while loop spin 我想最普遍的用法 就是先create一個task object(包含function pointer跟parameter) 然後把task放到task_queue裡面 thread就會去拿這個task然後執行function 不過這個作業比這複雜很多 我要執行的function F是在一個大的class A裡面的public function 所以直觀的作法當然是把function F包成一個task放到threadpool的task_queue裡面 可是function F用了很多private variable, private class, private function 而且class threadpool不能寫在class A底下 要額外寫在threadpool.h 所以事情就變得很複雜 因為我沒辦法把要用到的其他function或是variable等等pass給threadpool裡面的thread 想請問該怎麼設計會比較好呢? 我一直很苦惱的點是 threadpool.h裡面的class threadpool要怎樣才看得到class A裡面全部的東西? 有辦法做到這件事情嗎? 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 128.61.8.232 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1478205977.A.B38.html
fishlinghu: 請問可以用friend嗎? 不太常用這個方法所以不熟 11/04 05:01
ilikekotomi: 可以貼自己code讓大家更容易瞭解狀況 11/04 08:47
ilikekotomi: 置底文章有一些可以貼code的網站 11/04 08:47
SVman: 你可以試看看學member function 指到 function point 再thr 11/04 10:41
SVman: ead裡面呼叫這個function point看看 ,請參考tr1:function 11/04 10:41
SVman: 拍謝 沒看到Linux ,只是code稍微複雜的寫法 找一下c++的 11/04 10:44
SVman: 白皮書應該有 11/04 10:44
Caesar08: class member function也是function,你把parameter準備 11/04 10:49
Caesar08: 好就可以了 11/04 10:49
Caesar08: 打個廣告 https://github.com/Fdhvdu/ThreadPool 11/04 10:53
hn12404988: 需要看到你的程式碼,才能回答你的問題 11/04 11:02
hn12404988: 因為要達到你要的目的,作法有很多種 11/04 11:02
hn12404988: 例如:task怎麼包function F,task_queue具體結構是啥 11/04 11:03
hn12404988: 這些細節都會影響要怎麼回答你的問題 11/04 11:03
fishlinghu: 補充 我後來是pass member function pointer跟this 11/04 20:39
fishlinghu: 到threadpool的class裡面使用 也有用friend 11/04 20:40
fishlinghu: code有空我再上傳到Github跟大家分享 11/04 20:41
kevingwn: 把threadpool_task_t換成std::function或packeged_task 11/04 20:57
steve1012: STD bind 就好 11/04 21:56