[問題] Threadpool function問題

作者: fishlinghu (令狐瑜)   2016-11-04 04:46:12
開發平台(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):
作者: fishlinghu (令狐瑜)   2016-11-04 05:01:00
請問可以用friend嗎? 不太常用這個方法所以不熟
作者: ilikekotomi (Young)   2016-11-04 08:47:00
可以貼自己code讓大家更容易瞭解狀況置底文章有一些可以貼code的網站
作者: SVman   2016-11-04 10:41:00
你可以試看看學member function 指到 function point 再thread裡面呼叫這個function point看看 ,請參考tr1:function拍謝 沒看到Linux ,只是code稍微複雜的寫法 找一下c++的白皮書應該有
作者: Caesar08 (Caesar)   2016-11-04 10:49:00
class member function也是function,你把parameter準備好就可以了打個廣告 https://github.com/Fdhvdu/ThreadPool
作者: hn12404988 (Willy)   2016-11-04 11:02:00
需要看到你的程式碼,才能回答你的問題因為要達到你要的目的,作法有很多種例如:task怎麼包function F,task_queue具體結構是啥這些細節都會影響要怎麼回答你的問題
作者: fishlinghu (令狐瑜)   2016-11-04 20:39:00
補充 我後來是pass member function pointer跟this到threadpool的class裡面使用 也有用friendcode有空我再上傳到Github跟大家分享
作者: kevingwn (如雲如風的人生)   2016-11-04 20:57:00
把threadpool_task_t換成std::function或packeged_task
作者: steve1012 (steve)   2016-11-04 21:56:00
STD bind 就好

Links booklink

Contact Us: admin [ a t ] ucptt.com