作者fishlinghu (令狐瑜)
看板C_and_CPP
標題[問題] Threadpool function問題
時間Fri Nov 4 04:46:12 2016
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1478205977.A.B38.html
1F:→ fishlinghu: 請問可以用friend嗎? 不太常用這個方法所以不熟 11/04 05:01
2F:→ ilikekotomi: 可以貼自己code讓大家更容易瞭解狀況 11/04 08:47
3F:→ ilikekotomi: 置底文章有一些可以貼code的網站 11/04 08:47
4F:推 SVman: 你可以試看看學member function 指到 function point 再thr 11/04 10:41
5F:→ SVman: ead裡面呼叫這個function point看看 ,請參考tr1:function 11/04 10:41
6F:推 SVman: 拍謝 沒看到Linux ,只是code稍微複雜的寫法 找一下c++的 11/04 10:44
7F:→ SVman: 白皮書應該有 11/04 10:44
8F:→ Caesar08: class member function也是function,你把parameter準備 11/04 10:49
9F:→ Caesar08: 好就可以了 11/04 10:49
11F:推 hn12404988: 需要看到你的程式碼,才能回答你的問題 11/04 11:02
12F:→ hn12404988: 因為要達到你要的目的,作法有很多種 11/04 11:02
13F:→ hn12404988: 例如:task怎麼包function F,task_queue具體結構是啥 11/04 11:03
14F:→ hn12404988: 這些細節都會影響要怎麼回答你的問題 11/04 11:03
15F:→ fishlinghu: 補充 我後來是pass member function pointer跟this 11/04 20:39
16F:→ fishlinghu: 到threadpool的class裡面使用 也有用friend 11/04 20:40
17F:→ fishlinghu: code有空我再上傳到Github跟大家分享 11/04 20:41
18F:→ kevingwn: 把threadpool_task_t換成std::function或packeged_task 11/04 20:57
19F:推 steve1012: STD bind 就好 11/04 21:56