выполнение потоков в POSIX - PullRequest
1 голос
/ 16 июня 2011

Я создаю приложение асинхронного чата в C. Я создал два потока, один для получения, а другой для отправки, следующим образом.

void* send()
{
...
}

void* receive()
{
...
}

main()
{
..
inid = pthread_create(&incoming,NULL,receive,"Incoming thread");
outid= pthread_create(&outgoing,NULL,send,"Outgoing thread");

..

pthread_join(incoming,NULL);
pthread_join(outgoing,NULL);

..

}

В чем проблема, вызваны функции отправки и получениятолько один раз, и программа завершается.Я хочу, чтобы оба потока работали вечно, пока пользователь не захочет выйти (условие проверки на выход определено в функции send).Как это решить?

1 Ответ

3 голосов
/ 16 июня 2011

Одно из решений заключается в том, чтобы в цикле while(input != exit) был тип send .

И сделайте так, чтобы ваш main ждал только исходящего потока (что означает наличие pthread_join только для исходящего потока). Таким образом, когда пользователь выбирает выход, основной будет выходить, не дожидаясь входящего потока.

Во-вторых, вам нужно использовать блокирующую функцию приема в функции приема. Таким образом, он либо обрабатывает входящее сообщение, либо ожидает его.

Другое решение заключается в создании типа while(input != exit) цикла в main . Определите очередь сообщений, в которой main может ставить в очередь сообщения для отправки, а исходящий поток использует сообщения из этой цепочки для их фактической отправки.

Исходящий поток либо отправляет сообщение, либо блокируется до тех пор, пока в очереди не появится сообщение для отправки.

Поток ввода ведет себя так же, как описано в предыдущем решении.

...