Создание нескольких потоков и вызов других исполняемых файлов в 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