Я указал на это в комментарии, но это заслуживает усиления.
Ваше использование returnVal
неверно
API pthread_join
ожидает void**
, то есть указатель на void*
. В отличие от void*
, void**
не столь универсален. Это указатель определенного типа, и поэтому вы должны передавать только такой же тип адреса. Однако вы все равно его не используете, поэтому я бы посоветовал вам просто передать NULL. Как написано, это неопределенное поведение. И я могу почти гарантировать вам, что sizeof(char)
, доступный для записи размер адреса, который вы ему даете, и sizeof(void*)
, размер, который он ожидает получить, различны. Рассмотрим это вместо этого сейчас:
pthread_join(aThread[i], NULL);
Если вам интересно, как использовать этот параметр void**
, это место для хранения void*
возвращаемого значения из вашего потока-процедуры. Вспомните, как pthread thread-proc выглядит так:
void* thread_proc(void* args)
// ^----- this is what is stashed in the pthread_join second parameter
Вы считаете, что логика тестирования отказов обратная
Функция pthread_join
возвращает 0
в случае успешного выполнения; не на провал.
На самом деле вы не запускаете параллельные потоки
Параллелизм потоков просто означает, что ваши потоки выполняются одновременно. Но у вас нет. Вы запускаете поток, затем ждете его завершения, затем запускаете поток, затем ждете его завершения и т. д. Это буквально не лучше (и на самом деле хуже), чем простой вызов функция. Если вы хотите, чтобы ваши потоки выполнялись одновременно, ваша логика должна быть оформлена следующим образом:
pthread_t aThread[MAX_LENGTH];
int errCode[MAX_LENGTH] = {0};
for (int i = 0; i < MAX_LENGTH; i++)
{
if((errCode[i] = pthread_create(&aThread[i], NULL, &findMatch, &fpArgs)) != 0)
printf("error creating thread %d, error=%d\n", i, errCode[i]);
}
for (int i = 0; i < MAX_LENGTH; i++)
{
// note the check for errCode[i], which is only non-zero
// if the i'th thread failed to start
if(errCode[i] == 0)
{
errCode[i] = pthread_join(aThread[i], NULL))
if (errCode[i] != 0)
printf("error joining thread %d, error=%d\n", i, errCode[i]);
}
}
person
WhozCraig
schedule
10.10.2013
returnVal
в адресvoid**
является неопределенным поведением. Если толькоsizeof(char) == sizeof(void*)
в вашей системе (я могу почти гарантировать вам, что это нет), не похоже, что вы все равно используете его, и NULL является приемлемым вариантом, поэтому вы можете простоpthread_join(aThread[i], NULL);
Кроме того,pthread_join
возвращает ноль (0) в случае успеха, поэтому проверка на наличие ошибки с помощью!
выполняется в обратном порядке. Наконец, вы все равно не хотите делать это таким образом, вы хотите начать их все, затем присоединиться к ним всем. То, что у вас есть, буквально не лучше однопоточного. - person WhozCraig   schedule 10.10.2013