У меня проблемы с моей программой в VS .NET 2003.
Я изначально написал модуль, который использует библиотеку pthread для создания ряда потоков для обработки чего-либо. Это работает правильно в VS .NET 2003. Затем этот модуль был использован кем-то другим и интегрирован в другую большую программу. Я не уверен в деталях, но программа создает графический интерфейс, который позволяет пользователю выбрать опцию для запуска моего модуля.
Когда создается поток, в качестве идентификатора потока передается значение. Проблема с моим модулем в графическом интерфейсе состоит в том, что значение идентификатора потока равно 0 для всех потоков, в то время как идентификатор потока является правильным в модуле без графического интерфейса.
Вот как создается поток в модуле:
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)
Код такой же, так что я не понимаю, почему вывод неправильный для графического интерфейса, если только использование управляемых расширений / clr не имеет значения? (Я не совсем уверен, что это тоже.)
Отредактировано для добавления части кода, которая выводит идентификатор потока:
void *function(void *input)
{
int64_t threadid = *(int64_t *)input;
printf("threadid = %ld\n", threadid);
...
}
Пожалуйста, сообщите.
Спасибо.
С уважением,
Rayne