Чтение стандартного ввода из другого потока

Я использую p_threads в своем коде на Unix. В моей основной программе у меня есть узел потока, который создает 2 потока, один из которых выполняет чтение из стандартного ввода с помощью getline. Все это работает нормально. За исключением того, что в какой-то момент во время моего кода мне нужно «перезапустить мой поток, который читает со стандартного ввода». И когда я это делаю, я ничего не могу прочитать со стандартного ввода.

Любые предложения, что я могу делать неправильно ???/

Спасибо.

Это та часть, где я читаю со стандартного ввода

void* parseCmd(void* s) 
{

    sigset_t new2; 
    struct sigaction act; 
    sigemptyset(&new2); 
    sigaddset(&new2,SIGINT); 
    pthread_sigmask(SIG_UNBLOCK, &new2, NULL); 

    act.sa_handler = interrupt; 
    sigaction(SIGINT, &act, NULL); 
    signal(SIGUSR1, signal_Handler);

    std::string input("");
    while (1) 
    {

       std::cout << "SERVANT > ";
       std::getline(std::cin, input);

       doTheWork(input);
       cin.clear();

       std::cout << std::endl;

      if(global_shutdown==1 || auto_global_shutdown==1)
        break;
    }


    cout<<"cmd thread exit.Main\n"; 
    return 0;

}

person Teotia    schedule 24.03.2011    source источник
comment
Возможно, вы закрыли стандартный ввод, но трудно сказать, не видя примера кода.   -  person Fred Foo    schedule 24.03.2011
comment
Я прикрепил код выше   -  person Teotia    schedule 24.03.2011
comment
Как ты закрываешь эту тему?   -  person Martin York    schedule 24.03.2011
comment
если установлен глобальный флаг выключения, то я выхожу только из этой функции и возвращаю 0 в последней строке. Или, если я поймаю сигнал sigusr1, я выполняю pthread_exit().   -  person Teotia    schedule 24.03.2011
comment
Если поток находится в середине или выполняет getline(), когда обработчик сигнала вызывает выход, то состояние потока потенциально может быть испорчено (особенно любые блокировки). Обработчик сигнала должен установить некоторое состояние, позволяющее потоку завершиться после того, как он вернется из обработчика сигнала. Если поток зависает в getline() (ожидая ввода пользователя), то вам, вероятно, не следует использовать getline(). Выбор поиска(). Это позволяет вам останавливаться удобным для сигнала способом, ожидая ввода в потоке (поток C, но есть стандартный ввод).   -  person Martin York    schedule 24.03.2011


Ответы (1)


Вы, вероятно, прерываете поток, который все еще подключен к стандартному вводу, помните, что вы прервали поток, выполняя getline.

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

Что вам нужно сделать, это:

  • при входе в getline используйте общий флаг и установите для него значение true
  • установить переменную, в которую вы читаете, как статическую переменную и никогда не использовать для нее getline в любом потоке, кроме того, который требует перезапуска
  • когда вы реконструируете новый поток, не вызывайте getline, если флаг, входящий в getline, равен true
  • после того, как вы закончили получать строку, сбросьте логический флаг
  • использовать блокировку для предотвращения одновременного доступа к флагу строки чтения

Когда вам нужно значение, просто используйте статическую переменную, которую вы используете для передачи в getline.

person Marino Šimić    schedule 24.03.2011
comment
Эй .. спасибо, чувак ... ты был прав, я выходил из потока, все еще подключенного к стандартному вводу ... - person Teotia; 24.03.2011