簡體   English   中英

在VS .NET 2003中使用pthread

[英]Using pthreads in VS .NET 2003

我在VS .NET 2003中的程序遇到一些問題。

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

創建線程時,將傳入一個值作為線程ID。 我的模塊在GUI中的問題是所有線程的線程ID的值為0,而在沒有GUI的模塊中線程ID是正確的。

這是在模塊中創建線程的方式:

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]);
}

我檢查了兩個項目的屬性,下面列出了兩個項目之間的唯一區別:

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);
   ...
}

請指教。

謝謝。

問候,雷恩

將tid傳遞給函數時,您似乎處於競爭狀態-嘗試刪除Sleep(1)並使用無線程tid。 從上面的評論來看,這似乎可以解決問題。

為了回答您的另一個問題,當pthread_create返回到主線程時,已經創建了新線程(已為OS中的線程分配了內存等),但實際上可能尚未運行。 放置Sleep(1)使得新線程更有可能運行(強制主線程放棄時間片),但是不能保證線程會在主線程再次運行並調用free(tid [i])之前獲得tid。

因此,使工作線程空閑tid的想法-拾取它后將釋放。

如果將tid數組更改為int64的數組並傳遞&tid [i],則將不需要malloc / free並且競爭條件也已解決-盡管只有在保證只有一個調用方的情況下,此方法才有效一次圖書館。

我希望這會有所幫助-正確執行線程可能會很棘手,但值得付出努力!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM