2010-03-03 3 views
2

У меня возникли некоторые проблемы с моей программы в VS .NET 2003.Использование Pthreads в VS .NET 2003

я изначально написал модуль, который использует библиотеку PTHREAD создать несколько потоков для обработки что-то. Это выполняется правильно в VS.NET 2003. Затем этот модуль был использован кем-то другим и интегрирован в другую более крупную программу. Я не уверен в деталях, но программа создает графический интерфейс, который позволяет пользователю выбрать вариант для запуска моего модуля.

Когда поток создан, в качестве идентификатора потока передается значение. Проблема с моим модулем в GUI заключается в том, что значение идентификатора потока равно 0 для всех потоков, в то время как идентификатор потока является правильным в модуле без 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) 

Кодекса это то же самое, поэтому я не понимаю, почему вывод неправильный для графического интерфейса, если использование управляемых расширений/clr каким-то образом не имеет значения? (Я не совсем уверен, что те либо.)

Edited добавить часть кода, который выводит идентификатор потока:

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

Пожалуйста посоветуйте.

спасибо.

С уважением, Rayne

+0

Является ли библиотека pthreads портом от Unix до Win32? – Achilles

+0

Да, но как это проблема, если модуль работает без GUI? – Rayne

+0

Можете ли вы показать часть своей функции потока, которая читает аргумент tid? –

ответ

0

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

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

Следовательно, идея иметь свободный поток рабочего потока - он освободится после того, как он его поднимет.

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

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

Смежные вопросы