C - 线程同步

时间:2013-12-07 10:03:36

标签: c pthreads posix

我用线程制作了这个结构:

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;

            ...
}

我不知道为什么这不适用于这个线程实现。该程序处于无限循环中。

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()中失败时,关闭同一套接字两次很少有机会导致非常棘手的错误(套接字描述符可以被另一个线程重用,你会在这里无意中关闭它。)