pthread (ошибка сегментации) - PullRequest
       3

pthread (ошибка сегментации)

5 голосов
/ 05 ноября 2011

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

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

Результат получается примерно так ..

Before Thread 1 create
After Thread 1 create
Before Thread 0 create
After Thread 0 create
Before Thread 1 join
After Thread 1 join
Before Thread 0 join
Segmentation Fault(core dumped)

, когда я создаю 4 потока, это похоже на

Before Thread 3 create
After Thread 3 create
Before Thread 2 create
After Thread 2 create
Before Thread 1 create
After Thread 1 create
Before Thread 0 create
After Thread 0 create
Before Thread 3 join
After Thread 3 join
Before Thread 2 join
After Thread 2 join
Before Thread 1 join
After Thread 1 join
Before Thread 0 join
Segmentation Fault(core dumped)

Я не могу понять, почему.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

pthread_mutex_t mutex_lock;

struct arg_struct {
        int a;
        int b;
};

void *t_function(void *data) {
        pthread_mutex_lock(&mutex_lock);

        struct arg_struct *arg = (struct arg_struct *)data;
        long int s;

        s = arg->a;

        pthread_mutex_unlock(&mutex_lock);

        return (void **)s;
}

int main()
{
        int i;

        pthread_t p_thread[2];
        int thr_id;
        int status;

        struct arg_struct arg[2];

        for(i = 1; i >= 0; i--) {
                arg[i].a = i;
                arg[i].b = i;
        }

        pthread_mutex_init(&mutex_lock, NULL);

        for(i = 1; i >= 0; i--) {
                printf("Before Thread %d create\n", i);
                thr_id = pthread_create(&p_thread[i],NULL, t_function, (void *)&arg[i]);
                printf("After Thread %d create\n", i);
                usleep(1000);
        }

        int temp[2];

        for(i = 1; i >= 0; i--) {
                printf("Before Thread %d join\n", i);
                pthread_join(p_thread[i], (void**)&status);
                printf("After Thread %d join\n", i);
                temp[i] = status;
        }i

        printf("%d%d", temp[1], temp[0]);

        pthread_mutex_destroy(&mutex_lock);

        return 0;
}

1 Ответ

9 голосов
/ 05 ноября 2011
    pthread_t p_thread[2];
    struct arg_struct arg[2];
    int temp[2];

Вы выделили пространство только для двух элементов, поэтому, если вы запустите более 2 потоков, вы выйдете из конца массива и, возможно, аварийно завершите работу или повредите стек.

Дополнительно:

            pthread_join(p_thread[i], (void**)&status);

status - это int, а не void *;попытка этого попытается сохранить void * в int.На многих 64-битных платформах это также будет переполнено (поскольку void * будет 8 байтов, а int - 4).Сделайте status a void * и перестаньте пытаться отбрасывать ошибки компилятора, подобные этой.Это ошибки по причине.

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