2015-06-29 4 views
3

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

Поэтому я должен запустить две темы из третьего:

  1. WaitForClientMessage
  2. WaitForUserInput

Используя pthread, я представлял себе, что я могу назвать каждую нить и дать им идентификатор другой, поэтому, если они закончатся, они отменяют другой. Но теперь я вижу, что это не сработает.

Как это сделать? Я думаю, это просто, потому что такое поведение часто наблюдается, но я не знаю, как это работает.

EDIT Вот какой-то общий код, описывающий то, что я себе представлял.

void main_thread(void) 
{ 
    void * thread_rtn_val; 

    /* Parallel threads */ 
    pthread_t thread_WaitForClientMessage; 
    pthread_t thread_WaitForUserInput; 

    /* Run Threads */ 
    pthread_create(&thread_WaitForClientMessage, NULL, run_window, (void *)thread_sdp); 
    pthread_create(&thread_WaitForUserInput, NULL, run_client, (void *)arg_array); 
} 

.

void run_window(void) 
{ 

    /* Refresh screen and watch for user input */ 
    for(...) 
    { 
     if(user press enter) 
     { 
      phtread_cancel(thread_WaitForClientMessage) 
     } 
    } 
} 

.

void run_client(void) 
{ 
    /* Wait for client message */ 
    recv()... 
    phtread_cancel(thread_WaitForUserInput) 
} 
+0

Можете ли вы указать текущий код и соответствующий тег языка? – Marvin

+1

- это сообщение клиента, входящее в сокет, когда пользовательский ввод поступает с консоли? вы могли бы, вероятно, использовать 'select' или' poll' в одном потоке с подходящим значением таймаута. –

+0

@ Марвин Я добавлю код @ NG. Здесь потоки находятся на более высоких уровнях, и я не хочу изменять уже определенные функции сокетов. – JeanRene

ответ

0

Вы попробовали неблокирующий флаг для своей функции recv()?

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