Вывод в cin из рабочего потока (C++)

В моей программе есть основной поток, который принимает команды от пользователя. Отдельно он имеет потенциально многократные (по крайней мере, 1) рабочие потоки, перемещающие данные в фоновом режиме.

Пользователь может завершить программу с помощью команды, набрав в консоли. Однако, когда процесс сбора данных завершен, основной поток все еще блокирует ожидание пользовательского ввода, и, следовательно, программа не завершает свою работу.

То, что я хотел бы знать, это как написать команду завершения, "q\n", в std::cin из рабочего потока, так что поток ввода команды блокировки (также основной поток) будет прерван. Или это будет плохо? Я пробовал ниже, но программа просто зависает или не может записать std::cin, не уверен почему.

static ACE_THR_FUNC_RETURN worker( void *p) {
 .....
    if (_this->m_num_threads_done == _this->m_threads.size()) {
        fputs("q\n", stdin);
    }

}

в основном потоке это вызывается из основного:

void runEventLoop()
{
    printWelcomeMessage();

    char buffer[MAXC];
    while( !m_exitLoop )
    {
        std::cin.getline(buffer, MAXC);
        if( std::cin.eof() )
            break;
        handleCommand( buffer );
    }
}

Кто-нибудь, пожалуйста, посоветуйте, что я делаю не так, или иначе предложите лучшее решение для того, чего я пытаюсь достичь?

Спасибо

2 ответа

Решение

В Unix, когда вам нужен поток для ожидания нескольких вещей (например, символа в std::in и команды из рабочего потока, чтобы сообщить, что он завершает работу), вы используете select()... Вы можете создать канал с системным вызовом pipe() и рабочим потоком может писать в него при выходе... Основной поток, ожидающий в данный момент в cin, может вызвать select () для обоих, чтобы заблокировать, а затем соответствующим образом реагировать на любой из них, когда он проснулся до..

В Windows вы, вероятно, можете использовать WaitForMultipleObjects() для той же цели.

"Хорошим" решением было бы написать свою собственную функцию ввода, которая бы не блокировала и проверяла, нажата ли буква, иначе работает вхолостую. В этом цикле вы можете иметь проверку завершения.

Читайте о неблокирующем вводе с клавиатуры.

Кроме того, существует несколько зависимых от платформы решений, в зависимости от вашей библиотеки потоков и вашей операционной системы. Если бы вы расширили свой вопрос этой информацией, мы могли бы предложить кое-что.

Другие вопросы по тегам