pthread (segmentation fault)

I'm Korean and I'm not good at English but if you give me a comment down there I will be very pleased and will try to understand it.

I created, for example, 10 threads and tried to join them after creation and return the value. But when I join the last thread, I get a segmentation fault.

The result comes out like this..

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)

when I create 4 threads it's like

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)

I can't seem to find why.

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

Answers


    pthread_t p_thread[2];
    struct arg_struct arg[2];
    int temp[2];

You only allocated space for two elements here, so if you launch more than 2 threads you'll run off the end of the array and potentially crash or corrupt the stack.

Additionally:

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

status is an int, not a void *; attempting this will try to store a void * in an int. On many 64-bit platforms, this will also overflow (since void * will be 8 bytes while int is 4). Make status a void *, and stop trying to cast away compiler errors like this. They're errors for a reason.


Need Your Help

How to know if a type is a specialization of std::vector?

c++ metaprogramming

I've been on this problem all morning with no result whatsoever.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.