Использование pthreads в VS .NET 2003 - PullRequest
2 голосов
/ 03 марта 2010

У меня проблемы с моей программой в 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

1 Ответ

0 голосов
/ 03 марта 2010

Похоже, у вас есть состояние гонки при передаче функции в функцию - попробуйте удалить Sleep (1) и вместо этого использовать tid free thread. Из вашего комментария выше, кажется, это решает проблему.

Чтобы ответить на ваш другой вопрос, когда pthread_create возвращается в ваш основной поток, новый поток был создан (память выделена для потока в ОС и т. Д.), Но, возможно, еще не запущен. Установка Sleep (1) повышает вероятность того, что новый поток будет работать (заставляет основной поток отказаться от временного интервала), но нет гарантии, что поток получит tid до того, как основной поток снова запустится и вызовет free (tid [i]);

Отсюда идея, что рабочий поток будет свободен: он освободится после того, как его заберет.

Если вы измените свой массив tid на массив int64 и передадите & tid [i], то вам не понадобится malloc / free, и условие гонки также будет решено - хотя это работает, только если вы гарантированно имеете только один Звоните в вашу библиотеку сразу.

Надеюсь, это поможет - правильно организовать многопоточность может быть сложно, но оно того стоит!

...