我有一個簡單的線程池實現,使用boost::function
和boost::bind
將成員函數簽名減少爲void func(void)
。然後使用boost::function
和int
對的隊列,彈出隊列頂部並執行函數(全部包裝在互斥塊中)。Boost ::函數綁定成員函數變爲無效
threadPool->addJob(boost::bind(&Foo::bar, this, arg1, arg2));
...
typedef boost::function<void(void)> func;
std::queue<std::pair<func, int> > funcQ;
void ThreadPool::addJob(func f){
funcQ.push(std::make_pair(f, j));
}
if (!funcQ.empty()){
func localFunc = (funcQ.front()).first;
...
funcQ.pop();
...
localFunc();
}
然而,經過幾次反覆,這是造成段錯誤,當我調用該函數的()
運營商,所以我斷言語句拋出,以確保該函數是調用:
...
assert(funcQ.front().first);
func localFunc = (funcQ.front()).first;
...
瞧,經過幾次迭代之後斷言行程,表明我的boost::function
不可調用。
我首先想到函數數據(來自Foo
類)在函數被調用之前已被銷燬,但據我瞭解,boost::function
創建了一個數據副本,以無論如何形成閉包。不幸的是,我不知道是什麼原因導致boost::function
無法繼續解決問題。我是否會錯誤地綁定成員函數,或者是否存在問題並嘗試調用它?
編輯:我應該提到:Foo
分配在堆上,而不是delete
d直到線程連接。
'boost :: function'會創建一個你傳遞給它的'this'指針的副本,即它保持一個指向相同地址的指針。它不擁有'* this'的副本。 – juanchopanza