VS.NET2003のプログラムで問題が発生しています。
私は最初、pthreadライブラリを使用して、何かを処理するための多数のスレッドを作成するモジュールを作成しました。これはVS.NET2003で正しく実行されます。その後、このモジュールは他の誰かによって使用され、別のより大きなプログラムに統合されました。詳細はわかりませんが、プログラムは、ユーザーがモジュールを実行するためのオプションを選択できる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]);
}
両方のプロジェクトプロパティを確認しました。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)
コードは同じなので、マネージド拡張機能/ clrの使用が何らかの違いをもたらさない限り、GUIの出力が間違っている理由がわかりません。(どちらかはよくわかりません。)
スレッドIDを出力するコードの一部を追加するために編集されました。
void *function(void *input)
{
int64_t threadid = *(int64_t *)input;
printf("threadid = %ld\n", threadid);
...
}
お知らせ下さい。
ありがとうございました。
よろしく、レイン