Это не ошибка в коде, но для того, чтобы понять, как выполнить следующие критерии. Я видел аналогичные вопросы here и here, но не получил никакого конкретного способа сделать это.Уведомлять родителя о завершении потока
Рассмотрим следующие части кода:
....
pthread_create(&Receiver,NULL,ReceiveFromServer,(void*)&ClientSoc);
sending =1;
while (sending)
{
SHOW_PROMPT;
gets(message);
memcpy(Packet.data,message,MAX_DATA_LENGTH);
if (SetCommand(&Packet,message) == CMD_EXT)
sending = 0;
send(ClientSoc,&Packet,PACKET_SIZE,0);
}
close(ClientSoc);
pthread_join(Receiver,NULL);
return 0;
....
И в ReceiveFromServer
функции:
void* ReceiveFromServer(void* ClientSoc)
{
int receiving =1;
int Status;
strPacket Packet;
while(receiving)
{
if(recv(*(int*)ClientSoc,&Packet,PACKET_SIZE,0)>0)
{
ParseReply(Packet);
SHOW_PROMPT;
}
if(GET_COMMAND(Packet.Header) == CMD_EXT)
receiving = 0;
}
return NULL;
}
Пусть все объявленную или определено правильно.
Таким образом, поток прекращается в зависимости от полученных данных с сервера, но отправитель все еще работает, поскольку он не знает, что приемник завершен. Отправитель только выходит из цикла в зависимости от пользовательского ввода (конкретное слово, например «exit»).
Как уведомить родителя о завершении потока?
Я попытался сделать sending
глобальным и изменить его изнутри, но это не сработало.
@suufang, я упомянул, что видел этот вопрос, но это не отвечает на эту ситуацию. – Dipto
Опубликуйте полный пример, демонстрирующий вашу проблему. _Assume все объявлено или определено правильно_ - это предположение вызывает у вас проблемы в 100% случаев. –
Я этого не понимаю. Если приемник завершается в зависимости от того, что он получил от отправителя, отправитель должен знать заранее, что приемник прекратит свое действие, и, следовательно, этот отправитель может прекратить работу после отправки завершающих данных получателю, не так ли? – alk