C - 线程同步

标签 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;

            ...
}

我不知道为什么这不适用于此线程实现。程序陷入死循环。

最佳答案

无限循环可能发生在 write_all() 中,您应该使用 whilefor 循环来实现。你可能没有在那里处理一些错误代码 - 检查这个。我建议您使用 perror 函数来检查从您调用的标准函数返回的错误代码。

stat = write(sockfd, buffer, size);
if (stat < 0) {
    perror("write");
    // handle error
    ...
}

您还有一个设计缺陷:当 write()write_all()send_message() 中失败时关闭同一个套接字两次有很小的机会导致非常棘手的错误(套接字描述符可以被另一个线程重用,你会在这里不经意地关闭它)。

关于C - 线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440057/

相关文章:

c - 对具有固定数量的零的数组进行随机抽样

c++ - valgrind 中的 helgrind 提示简单的互斥锁

c - PThread 地址空间

c++ - 创建线程时出现段错误

c - Posix 共享内存初始化

c - 为什么设备的 stat::st_size 为 0 但同时 lseek 正确定义了设备大小?

带有结构的 C 数组 - 不能更改变量

c++ - 使用 void 指针作为 FFI 接口(interface)类型的好处

c - lkm函数劫持BUG

sockets - SO_REUSEADDR 和 AF_UNIX