Ошибка сегментации getline (строки) в C ++ в отношении многопоточности

0

Я прошу прощения за несколько двусмысленный титул, но я действительно не мог придумать более удобный способ его написать.

Я разрабатываю оболочку для класса, который, как предполагается, способен обрабатывать фоновые рисунки. Однако, поскольку оболочка не ждет дочерний процесс, когда фоновая настройка включена, я подумал, что было бы лучше создать второй поток, единственной целью которого является очистка дочернего процесса, когда он будет завершен. Теперь это отлично работает, пока не завершится дочерний процесс. Когда дочерний процесс завершается, следующий вход, который я вводил, дает мне ошибку сегментации. Используя gdb, я понял, что ошибка возникает из моей функции getline.

Я протестировал его, и std :: cin, похоже, не проблема. Кроме того, когда не фоновые, все работает отлично, никаких проблем вообще.

Для проверки фона я написал программу a.out, которая печатает, спит в течение десяти секунд, затем снова печатает перед выходом. Выход:

/Users/opname/Shell Project>./a.out&
/Users/opname/Shell Project>Sleep time!
ls
opshell   a.out     pseudocode.c    test.txt
opshell.cpp a.out.dSYM  shell.h     test2.txt
opshell.dSYM    gcctest.c   sleeper.c   testdir
/Users/opname/Shell Project>Awake time!
ls
Segmentation fault: 11

Здесь код, где я форк процесс и создаю новый поток:

            pid_t cpid = fork();
            if (cpid > 0) {
                int status;
                if (conc) { // if backgrounding enabled
                    pthread_t waiter;
                    struct tcpara *pm = (struct tcpara*) malloc(sizeof(struct tcpara));
                    pm->cpid = cpid;
                    pm->status = &status;
                    pthread_create(&waiter, NULL, &thread_handler, (void*)pm);
                    pthread_detach(waiter);
                }
                else waitpid(cpid, &status, 0);
                break;

            } else if (cpid == 0) {
                loc += cmd;
                execv(loc.c_str(), argv);
                _exit(0);
            }

И здесь подпрограмма, вызванная официанткой:

void *thread_handler(void *pm) {
  struct tcpara *ofpm = (struct tcpara*) pm;
  waitpid(ofpm->cpid, ofpm->status, 0);
  free(pm);
  return NULL;
}
Теги:
multithreading
fork

1 ответ

0
Лучший ответ

Попробуйте динамически распределять динамическую переменную состояния. Когда поток должен использовать его, он больше не существует, потому что он вышел из сферы видимости. Я думаю, что так происходит с waiter. Вы можете попробовать сделать их статичными.

  • 0
    Мне стыдно. Большое спасибо, приятель.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню