我用线程制作了这个结构:
struct backup_t {
int sockfd;
int size;
char *buffer;
pthread_t server_thread;
};
这是函数线程执行:
void* backup_secundary_server(void *args) {
struct backup_t *backup = (struct backup_t *) args;
if(send_message(backup->sockfd, backup->size, backup->buffer) == -1) {
close(backup->sockfd);
backup->sockfd = 0;
}
pthread_exit(NULL);
}
int send_message(int sockfd, int size, char* buffer) {
if(write(sockfd, &size, sizeof(int)) < 0){
close(sockfd);
return -1;
}
if(write_all(sockfd, buffer, size) < 0){
close(sockfd);
return -1;
}
pthread_exit(NULL);
return 0;
}
这是创建线程的地方:
int main(int argc, char **argv) {
...
struct backup_t backup;
backup.sockfd = sockfdSecundaryServer;
backup.size = sizeReceived;
backup.buffer = receivedBuffer;
if(pthread_create(&backup.server_thread, NULL, &backup_secundary_server, (void*)&backup)) {
return -1;
}
pthread_join(backup.server_thread, NULL);
if (send_message(pollfdSecundary[i].fd, sizeSend, sendBuffer) == -1)
return -1;
...
}
我不知道为什么这不适用于这个线程实现。该程序处于无限循环中。
答案 0 :(得分:0)
无限循环可能发生在write_all()中,您应该使用 while 或 for 循环来实现。你可能没有在那里处理一些错误代码 - 检查一下。我建议你使用 perror 函数来检查你正在调用的标准函数返回的错误代码。
stat = write(sockfd, buffer, size);
if (stat < 0) {
perror("write");
// handle error
...
}
您还有一个设计缺陷:当 write()或 write_all()在 send_message()中失败时,关闭同一套接字两次很少有机会导致非常棘手的错误(套接字描述符可以被另一个线程重用,你会在这里无意中关闭它。)