我在做一个并发服务器,我有一个进程,它的功能是连接关闭的线程。问题是我在他检查线程是否工作的时候遇到了分段错误。
在这里,我将状态初始化为2,这意味着仍然没有执行。我执行线程

for (int i = 0; i < Max_threads; i++){
        clients_data[i].client_number = 0;
        clients_data[i].status = 2;
    }
pthread_create(&tjoins, NULL, (void *(*) (void *))process_joins, (void*)&clients_data);

这是函数:
void* process_joins(struct clients* data[Max_threads]){
    while (true){
        for (int i = 0; i < Max_threads; i++){
            if(data[i]->status == 0){
                pthread_join(tclient[data[i]->position], (void**)&data[i]->info);
                data[i]->client_number = 0;
            }

        }
    }
    return 0;

在执行printf检查代码中断的位置时,我知道它发生在以下行:
if(data[i]->status==0){

提前谢谢你。

最佳答案

我想你已经声明-

struct clients clients_data[Max_threads];

您正在将clients_data传递给函数,该函数的类型为-&clients_data。但函数所期望的是struct clients (*)[Max_threads]。这两件事都不一样。
若要解决此问题,可以将函数定义更改为-
void* process_joins(struct clients (*data)[Max_threads]){
    while (true){
        for (int i = 0; i < Max_threads; i++){
            if((*data)[i].status == 0){
                pthread_join(tclient[(*data)[i].position], (void**) &((*data)[i].info));
                (*data)[i].client_number = 0;
            }
        }
    }
}

但是由于这个函数应该期望struct clients* [Max_threads],我建议使用
void *process_joins(void *data_ptr) {
    struct clients (*data)[Max_threads] = data_ptr;
    // Rest of the function same as above
}

现在,虽然这可以解决您的问题,但实际上不需要指向数组的指针,只需将指向第一个元素的指针作为-
pthread_create(&tjoins, NULL, (void *(*) (void *))process_joins, (void*)clients_data);

把你的功能定义为-
void* process_joins(void *clients_data_ptr){
    struct clients *data = clients_data_ptr;
    while (true){
        for (int i = 0; i < Max_threads; i++){
            if((data[i].status == 0){
                pthread_join(tclient[data[i].position], (void**) &(data[i].info));
                data[i].client_number = 0;
            }

        }
    }
}

关于c - 做并发服务器的C中的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52879037/

10-11 16:49