我正在尋找一些關於OpenMP的建議。我對使用threadprivate變量感到困惑。這個問題可以在下面的例子中呈現:在動態DLL中使用線程私有變量?
-----------
// The code below is located the dynamically loaded DLL.
/* Global variable. */
int *p;
#pragma omp threadprivate(p)
extern "C" __declspec(dllexport) int MyFunc1(void)
{
int i;
#pragma omp parallel for
for (i = 0; i < n; i++) {
MyFunc2(i);
}
return TRUE;
}
void MyFunc2(void)
{
p = malloc(sizeof(int));
*p = 0;
printf(「value = %d」,*p);
free(p);
}
-----------
在這裏,我想每個線程都有一個全局線程無關的變量,將在該線程的所有功能可見的單獨副本。該變量將在線程中初始化並銷燬。
「問題」在這裏是包括全局變量「p」的定義中的所有代碼位於動態加載DLL(通過調用LoadLibrary)。
微軟說http://msdn.microsoft.com/en-us/library/2z1788dd.aspx:「你不能在任何將通過LoadLibrary加載的DLL中使用threadprivate。這包括使用/ DELAYLOAD(延遲加載導入)加載的DLL,它也使用LoadLibrary。「因此,如果我弄明白了,上面的代碼是不正確的 - threadprivate變量和動態加載的DLL不會混合。
爲了驗證這一點,我創建動態加載DLL加載運行使用線程專用如上所述並聯的功能的測試項目。這一切都很好!
嗯......現在我很困惑,因爲該項目不應該工作。
我真的可以在動態DLL中使用線程私有變量嗎?或者有一個技巧嗎?
謝謝
亞歷
它沒有工作就好了。你預計它會失敗,並沒有失敗。不要做你期望的事情,永遠不要描述爲工作得很好。你打破了規則,並沒有達到你的預期。 *這是你首先應該預料到的。 –