Создание нескольких потоков и вызов других функций в Cygwin через system ()? - PullRequest
1 голос
/ 31 октября 2010

Я работаю над проектом в 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);
}

Но это не работает.Ошибка, которую я получаю, это ошибка сегментации с переполнением стека.В любом случае есть идея, как параллельно вызывать другие исполняемые файлы в системной оболочке, создавая несколько потоков?Благодарю.

Ответы [ 3 ]

1 голос
/ 14 апреля 2013

Добавьте этот код:

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

до

pthread_exit(NULL);

как вызывается в main().

1 голос
/ 13 апреля 2016

Несколько ошибок здесь:

  1. В функции main () после создания потока вы должны использовать pthread_exit () для выхода из всех отдельных потоков.Таким образом, использование exit () не здесь.

  2. В конце функции main () непосредственно перед завершением основного потока вызовите pthread_join () для ожидания всех отдельныхзавершение потока.

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

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

0 голосов
/ 31 октября 2010

Об этой проблеме стоит сообщить в список рассылки Cygwin.

Вместо этого вы можете покончить с потоками и использовать fork () / exec () или spawn (_ P_NOWAITO, ...) для создания дочерних процессов.

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

...