2014-12-20 2 views
0

Я хотел бы «отправить сообщение» scanf из потока в основную программу, я спрашиваю, как дать функции «scanf» или «cin», что-то прекратить ждать.Стоп scanf от ожидающего ввода, с другим потоком

Обычно вы пишете что-то на консоли и нажимаете «enter». Как я могу сделать то же самое из другого потока?

Пример:

int main() 
{ 
    ///// Some code to make the thread work ecc 
    std::cin >> mystring; 
    std::cout << mystring; // It should be "Text into mystring"; 
} 


// From the other thread running... 
void mythread() 
{ 
    std::string test = "Text into mystring"; 
    // Write test to scanf! How? 
} 

Как я могу добиться того, что ??

+0

Ваш вопрос нуждается в уточнении. Не имеет смысла говорить «отправить сообщение« scanf ». Кроме того, вы не хотите использовать' scanf' с C++ 'std :: string' в любом случае. Я не могу определить, что вы здесь задаете. – frasnian

+0

@frasnian Отредактировано. Дайте мне знать, если это яснее. –

+0

Вход для 'std :: cin' обычно поступает с клавиатуры или другого файла, а не из самой программы. Вы хотите просто установить 'mystring' со строкой из' mythread() '. Если это так, вы должны использовать 'std :: async()' и получить значение из возвращаемого будущего с помощью 'get()'. Имейте 'mythread()' return 'mystring'. – 0x499602D2

ответ

3

Как я понял, вы пытаетесь отправить информацию между потоками. Официальное название называется Interthread Communication.

Если вы хотите использовать зсапЕ вы должны использовать трубы, который является средством связи между процессов не Темы

Вот способ, которым Вы можете общаться между потоками. Нити чтения представляют собой поток scanf. Нить писателя представляет собой миф.

Система проста. У вас есть общая память. Когда один поток пытается записать его, он блокирует память (которая находится в очереди в примере) и записывает. Когда другой пытается его прочитать, он снова блокирует память и считывает ее, а затем удаляет (выдает из очереди). Если очередь пуста, поток читателя ждет, пока кто-то что-нибудь что-нибудь что-нибудь напишет.

struct MessageQueue 
{ 
    std::queue<std::string> msg_queue; 
    pthread_mutex_t mu_queue; 
    pthread_cond_t cond; 
}; 

{ 
    // In a reader thread, far, far away... 
    MessageQueue *mq = <a pointer to the same instance that the main thread has>; 
    std::string msg = read_a_line_from_irc_or_whatever(); 
    pthread_mutex_lock(&mq->mu_queue); 
    mq->msg_queue.push(msg); 
    pthread_mutex_unlock(&mq->mu_queue); 
    pthread_cond_signal(&mq->cond); 
} 

{ 
    // Main thread 
    MessageQueue *mq = <a pointer to the same instance that the main thread has>; 

    while(1) 
    { 
     pthread_mutex_lock(&mq->mu_queue); 
     if(!mq->msg_queue.empty()) 
     { 
      std::string s = mq->msg_queue.top(); 
      mq->msg_queue.pop(); 
      pthread_mutex_unlock(&mq->mu_queue); 
      handle_that_string(s); 
     } 
     else 
     { 
      pthread_cond_wait(&mq->cond, &mq->mu_queue) 
     } 
    } 
Смежные вопросы