Вывод в 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() для той же цели.
"Хорошим" решением было бы написать свою собственную функцию ввода, которая бы не блокировала и проверяла, нажата ли буква, иначе работает вхолостую. В этом цикле вы можете иметь проверку завершения.
Читайте о неблокирующем вводе с клавиатуры.
Кроме того, существует несколько зависимых от платформы решений, в зависимости от вашей библиотеки потоков и вашей операционной системы. Если бы вы расширили свой вопрос этой информацией, мы могли бы предложить кое-что.