【发布时间】:2014-03-12 03:20:06
【问题描述】:
这不是代码中的任何错误,而是要了解如何完成以下条件。我见过类似的问题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;
}
假设所有内容都已正确声明或定义。
因此线程根据从服务器接收到的数据终止,但发送方仍然循环,因为它不知道接收方已终止。发件人仅根据用户输入(诸如“退出”之类的特定词)退出循环。
如何通知父线程正在终止?
我试图将sending设为全局并从线程内部更改它,但它不起作用。
【问题讨论】:
-
@suufang,我提到我看到了这个问题,但这并没有回答这种情况。
-
发布一个完整的示例来演示您的问题。 假设所有内容都已正确声明或定义 - 该假设让您 100% 陷入麻烦。
-
我不明白。如果接收方根据从发送方收到的内容终止,则发送方应该提前知道接收方将终止,因此发送方可以在向接收方发送终止数据后自行终止,不是吗?
-
@alk,这里的接收者和发送者来自客户端程序。它接收并发送到服务器程序。所以这个发送者不知道这个接收者会得到什么,因为那是由服务器发送的。
-
Ahok,我明白了.. 一定是我这边暂时的脑瘫。您可能想按照下面的答案选择 Martin 的方法。
标签: c multithreading pthreads