2016-01-21 3 views
0

Это вопрос интервью в псевдокоде. Мне сказали, что есть проблемы в следующем подходе. Я не мог найти ничего другого, кроме как удерживать основной поток, пока событие ждет. Можете ли вы, ребята, увидеть какие-то реальные проблемы?Сигнал между потоками

Вот вопрос:

Существует основной поток и дочерний поток. Детский поток контролирует сообщение 30K, которое отправляется в 1K кусках из внешнего источника. После того, как дочерний поток увидит готовый кусок 1K, он сигнализирует функции основного потока для извлечения данных. Псевдокод является:

// This method is called in main thread 

void MainThreadFunction(out message) 
{ 
    var buffer; 

    loop 
    { 
     event.Wait; 
      read data to buffer; 
     event.Release; 

     if (all the data of the message complete) 
     { 
      exit loop; 
     } 
    } 

    copy buffer to message; 
} 

// This method is in child thread 

void ChildThreadFunction() 
{ 

    // once the 1K chunk of data is ready 
    event.Set; 
} 
+0

Если я понимаю код правильно, нет никакого смысла в использовании детской нити, как это. Как вы писали, основной процесс ждет, пока ребенок прочитает 1K. Он мог бы также прочитать сам 1K. –

ответ

1

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

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

См: https://en.wikipedia.org/wiki/Multiple_buffering

Смежные вопросы