Ошибка сегментации в C, делающем параллельный сервер - PullRequest
0 голосов
/ 18 октября 2018

Я делаю параллельный сервер, и у меня есть процесс, функция которого состоит в присоединении к закрытым потокам.Дело в том, что я получаю ошибку сегментации в тот момент, когда он проверяет, работает ли поток.

Здесь я инициализирую статус 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){

Заранее спасибо.

1 Ответ

0 голосов
/ 18 октября 2018

Я предполагаю, что вы объявили clients_data как -

struct clients clients_data[Max_threads];

Вы передаете &clients_data функции, которая имеет тип - struct clients (*)[Max_threads].Но функция ожидает 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;
            }
        }
    }
}

Но так как эта функция должна ожидать void*, я бы предложил использовать

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;
            }

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...