Чтение стандартного ввода из другого потока - PullRequest
3 голосов
/ 24 марта 2011

Я использую 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;

}

1 Ответ

4 голосов
/ 24 марта 2011

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

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

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

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

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

...