2011-02-24 35 views
5

如何將boost :: shared_ptr作爲指向Windows線程函數的指針傳遞? 假設下面的代碼:如何將boost :: shared_ptr作爲指向Windows線程函數的指針傳遞?

test::start() 
{ 
    .... 
    _beginthreadex(NULL, 0, &test::threadRun, &shared_from_this(), 0, &threadID); 

    ... 
    ... 
} 

/*this is a static function*/ 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
    shared_ptr<test> k = *static_cast< shared_ptr<test>* >(lpParam); 
    ... 
} 

我覺得這個代碼不正確,你有什麼想法? 我該怎麼做?

編輯:我通過boost :: weak_ptr解決了我的問題。請在此處查看我自己的答案page

+2

爲什麼不直接使用Boost.Thread呢? – jalf 2011-02-24 08:21:46

+0

我有很多與Windows線程工作的代碼,目前我沒有足夠的時間將它們轉換爲boost.Thread,另外,我從來沒有使用boost.thread。 – 2011-02-24 08:23:32

+3

你不需要將它們全部轉換。但Boost.Thread是類型安全的,並且非常直觀地處理了這個問題。 – jalf 2011-02-24 08:33:13

回答

1

我用的boost :: weak_ptr的解決我的問題參考計數效果很好。

如果你想通過boost::shared_ptr你可以把它變成具有侵入引用計數結構,並通過它英寸

這是假設你不就是想在一個原始指針傳遞和獲取接收線程完成後刪除它。

+3

這不能保證解決問題,因爲wPtr是test :: start()中的局部變量,並且在test :: start()結束時會失效,所以問題與以前一樣,除非您等待線程在start()退出之前開始「拾取」參數。 – CashCow 2011-02-24 12:11:52

1

您應該使用reinterpret_cast並注意在產卵期間至少保留一個shared_ptr。否則你的物體將被毀壞。也就是說,由於你傳遞了一個指向shared_ptr的指針,你不會享受通常的指針保護,並且如果所有現有的shared_ptrs都被銷燬了,那麼當你的線程產生時它將包含一個非法指針。

3

當你必須從一個類傳遞參數到一個靜態函數/方法,你擁有的是一個回調參數(通常在線程回調函數中)時,我通常會將this傳遞給回調函數。這樣你就有了一個簡單的演員,你可以訪問你班級的所有成員。實際上,回調是爲你的類的成員:

test::start() 
{ 
    .... 
    shared_ptr<test> shPtr = shared_from_this(); 
    boost::weak_ptr<test> wPtr=shPtr; 
    _beginthreadex(NULL, 0, &test::threadRun, &wPtr, 0, &threadID); 

    ... 
    ... 
} 

/*this is a static function*/ 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
shared_ptr<test> k  = static_cast< boost::weak_ptr<test>* >(lpParam)->lock(); 
    ... 
} 
0

這是一種情況的實際哪裏侵入:

test::start() 
{ 
    // [...] 
    _beginthreadex(NULL, 0, &test::threadRun, this, 0, &threadID); 
    // [...] 
} 

// this is a static function 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
    test* self = static_cast<test*>(lpParam); 

    // do whatever you want with all the instance members :) 

    self->getMyShared(); 
    self->useMyGreatMemberMethof(); 

    // ... 
} 

MY2C

相關問題