2013-06-09 1 views
0

Я использую MINGW на моей машине Windows 7 для кодирования потоков POSIX.Первые 2 потока не выполняются, если я создаю потоки в цикле

Рассмотрим следующий простой код:

#include <stdio.h> 
#include <pthread.h> 
#include <process.h> 
#define NUM_THREADS 5 

void *PrintHello(void *threadid) 
{ 
    long tid; 
     tid = (long)threadid; 
    printf("Hello Dude...!!!\t I am thread no #%ld\n",tid); 
    pthread_exit(NULL); 
} 
int main() 
{ 
    pthread_t thread[NUM_THREADS]; 
    int rc; 
    long t; 
    for(t=0;t<NUM_THREADS;t++) 
    { 
     printf("Inside the Main Thread...\nSpawning Threads...\n"); 
     rc=pthread_create(&thread[t],NULL,PrintHello,(void*)t); 
     if(rc) 
     { 
      printf("ERROR: Thread Spawning returned code %d\n",rc); 
      exit(-1); 
     } 
    } 
    return 0; 
} 

Над программой при выполнении в моей системе он показывает следующий вывод:

Inside the Main Thread... 
Spawning Threads... 
Inside the Main Thread... 
Spawning Threads... 
Hello Dude...!!!   I am thread no #0 
Inside the Main Thread... 
Spawning Threads... 
Hello Dude...!!!   I am thread no #1 
Inside the Main Thread... 
Spawning Threads... 
Hello Dude...!!!   I am thread no #2 
Inside the Main Thread... 
Spawning Threads... 

Эта программа должна была нереститься 5 нитей. Но он создал только 2 потока. Первые 2 и последние 2 строки предполагают, что подпрограмма pthread_create() будет вызвана. А поскольку переменная «rc» не является «1», поэтому нет никакой ERROR в создании потоков, иначе она попала бы в «if (rc)».

Итак, где ошибка? Или это связано с моей машиной для окон.

ответ

0

На самом деле, настоящая проблема заключается в том, что ваша программа заканчивается, когда ваши основные концы. Вы должны pthread_join им, прежде чем вернуться с основного. Остальные потоки просто не получают возможности запускать до основных выходов, используя все пространство процесса (и ваши неиспользуемые потоки).

for(t=0;t<NUM_THREADS;t++) 
{ 
    printf("Inside the Main Thread...\nSpawning Threads...\n"); 
    rc=pthread_create(&thread[t],NULL,PrintHello,(void*)t); 
    if(rc) 
    { 
     printf("ERROR: Thread Spawning returned code %d\n",rc); 
     exit(-1); 
    } 
} 

/* add this and you're golden! */ 
for(t=0; t<NUM_THREADS;t++) { 
    pthread_join(thread[t], NULL); 
} 

Ниже был мой первоначальный ответ, и по-прежнему хороший совет:

не проходят долго, как пустота *. Пропустите его адрес. Если вам нужно, сделайте копию его каждый раз через цикл, чтобы пройти и освободить его позже.

long thread_data[NUM_THREADS]; 
for(t=0;t<NUM_THREADS;t++) 
    { 
     thread_data[t] = t; 
     printf("Inside the Main Thread...\nSpawning Threads...\n"); 
     rc=pthread_create(&thread[t],NULL,PrintHello,(void*)&(thread_data[t])); 
     if(rc) 
     { 
      printf("ERROR: Thread Spawning returned code %d\n",rc); 
      exit(-1); 
     } 
    } 
+0

я изменил долго Int, но по-прежнему первый поток не получает казнен ... – Shantanu

+0

Спасибо, что работало ... – Shantanu

1

Исключена ошибка.

Ваша программа выходит, прежде чем другие потоки имеют возможность выводить что-либо, и выход из вашей программы убивает все ее потоки.

Вам понадобится pthread_join все ваши темы, если вы хотите, чтобы все они закончили правильно.

+0

Я новичок в многопоточность вы можете предложить мне изменения ... – Shantanu

+0

Пожалуйста, поиск 'pthread_join ', вы найдете много информации и примеры того, как именно вы должны это делать. Просто назовите 'pthread_join' на каждом из порожденных потоков во втором цикле в' main'. – Mat

+0

Спасибо, сработало ... – Shantanu