Създаване на множество нишки и извикване на други изпълними файлове в Cygwin чрез system()?

Работя върху проект в Cygwin. При опит да се създадат множество нишки в C и всяка нишка извиква друг изпълним файл чрез командния ред, използвайки функцията system(), се оказва, че нещата не работят правилно. По-конкретно, кодът, който имам, е следният:

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

void *PrintHello(void *threadid)
{
  long tid;
  tid = (long)threadid;
  system("date ");
  pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for(t=0; t<NUM_THREADS; t++){
    printf("In main: creating thread %ld\n", t);
    rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
    if (rc){
       printf("ERROR; return code from pthread_create() is %d\n", rc);
       exit(-1);
    }
  }
  pthread_exit(NULL);
}

Но не става. Грешката, която получавам, е грешка при сегментиране с препълване на стека. Все пак има ли идея как да извикате други изпълними файлове в системната обвивка паралелно чрез създаване на множество нишки? Благодаря.


person user492506    schedule 31.10.2010    source източник
comment
Няма нищо очевидно нередно в кода и той работи добре на Linux. Като изстрел в тъмното линкна ли с -pthreads, -lpthreads и т.н.?   -  person Duck    schedule 31.10.2010


Отговори (3)


Добавете този код:

for(t=0; t<NUM_THREADS; t++){
  pthread_join(threads[t], NULL);
}

преди

pthread_exit(NULL);

както се нарича в main().

person omer    schedule 14.04.2013

Няколко грешки тук:

  1. Във функцията main(), след като създадете нишката, трябва да използвате pthread_exit(), за да излезете от цялата отделна нишка. Така че използването на exit() не е правилно тук.

  2. В края на функцията main(), точно преди да прекратите основната нишка, извикайте pthread_join(), за да изчакате цялата отделна нишка да приключи.

  3. В края, след като всички дъщерни нишки са прекратени, можете да извикате exit(), за да прекратите самия процес.

http://www.thegeekstuff.com/2012/04/terminate-c-thread/

person Peter Teoh    schedule 13.04.2016

Този проблем изглежда заслужава да бъде докладван в пощенския списък на Cygwin.

Това, което можете да направите вместо това, е да премахнете нишките и да използвате fork()/exec() или spawn(_P_NOWAITO, ...), за да създадете дъщерните процеси.

(spawn() всъщност е семейство от функции; вижте /usr/include/process.h за подробности Използването му е препоръчително, тъй като избягва високата вилица на Cygwin.)

person ak2    schedule 31.10.2010