2010-03-03 92 views
2

使用並行線程我有在VS .NET 2003在VS .NET 2003

一些問題,我的節目,我最初寫了使用並行線程庫創建多個線程來處理事情的一個模塊。這在VS .NET 2003中正確運行。然後這個模塊被其他人使用並且被集成到另一個更大的程序中。我不確定細節,但程序創建了一個GUI,允許用戶選擇一個選項來運行我的模塊。

當創建線程,一個值被傳遞作爲線程ID。我的模塊在GUI中的問題在於,線程ID的值對於所有線程都是0,而線程ID在沒有GUI的模塊中是正確的。

這裏的線程是如何在模塊中創建:

int64_t *tid[1000]; 
int64_t i = 0, rc; 

for (i = 0 ; i < NUM_THREADS ; i++) 
{ 
    tid[i] = (int64_t *) malloc(sizeof(int64_t)); 
    *tid[i] = i; 
    rc = pthread_create(&pthread, &attr, function, (void *)tid[i]); 
    Sleep(1); 
    if(rc) 
    { 
     free(tid[i]); 
     exit(1); 
    } 
    free(tid[i]); 
} 

我查了一下兩者的項目屬性,以及2個項目之間的唯一不同之處列舉如下:

GUI - use managed extensions | my module (w/o GUI) - does not use managed extensions 
In C/C++ preprocessor: 
    GUI - WIN32;_DEBUG;_CONSOLE;WINDOWS | my module (w/o GUI) - none 
In C/C++ Additional Options: 
    GUI - /CLR | my module (w/o GUI) - no /CLR (error with /CLR: fatal error LNK1000: Internal error during BuildImage) 

代碼是一樣的,所以我不明白爲什麼GUI的輸出是錯誤的,除非使用託管擴展/ clr以某種方式改變了它? (我真的不知道這些是什麼的要麼。)

編輯補充輸出線程ID代碼的一部分:

void *function(void *input) 
{ 
    int64_t threadid = *(int64_t *)input; 
    printf("threadid = %ld\n", threadid); 
    ... 
} 

請指教。

謝謝。

問候, 雷恩

+0

是並行線程庫從Unix到Win32的端口? – Achilles 2010-03-03 03:23:08

+0

是的,但是如果模塊在沒有GUI的情況下工作,那麼問題又是如何呢? – Rayne 2010-03-03 03:31:01

+0

您可以顯示讀取tid參數的線程函數的一部分嗎? – 2010-03-03 04:09:40

回答

0

看樣子你有傳遞TID的功能時的競爭條件 - 嘗試刪除睡眠(1),並具有無螺紋TID代替。從上面的評論看來,這似乎解決了這個問題。

爲了回答您的其他問題,當在pthread_create返回到你的主線程,新線程已創建(在OS分配給線程的內存等),但可能沒有實際運行呢。放置睡眠(1)使新線程運行的可能性更大(強制主線程放棄時間片),但是不能保證線程在主線程再次運行並調用free(tid [i])之前獲得tid;

因此具有工作線程自由TID的想法 - 它已經把它撿起來後,它會釋放。

如果您將您的tid數組更改爲int64的數組並且通過& tid [i],那麼您將不需要malloc/free並且競態條件也解決了 - 儘管只有在您保證有一次只有一個來電者來圖書館。

我希望這有助於 - 讓線程權可能會非常棘手,但值得努力!