Like Tree1Likes
  • 1 Post By vart

pthreads join problem

This is a discussion on pthreads join problem within the C Programming forums, part of the General Programming Boards category; I am trying to emulate callback mechanism in C. The code I have is follows: Code: #include <stdio.h> #include <pthread.h> ...

  1. #1
    Registered User
    Join Date
    Jun 2013
    Location
    Jodhpur, India
    Posts
    1

    Question pthreads join problem

    I am trying to emulate callback mechanism in C. The code I have is follows:

    Code:
    #include <stdio.h>
    #include <pthread.h>
    
    struct fopen_struct {
        char *filename;
        char *mode;
        void *(*callback) (FILE *);
    };
    
    void *fopen_callback(FILE *);
    pthread_t fopen_t(void *(*callback)(FILE *), const char *, const char *);
    void *__fopen_t__(void *);
    
    pthread_t fopen_t(void *(*callback)(FILE *), const char *filename, const char *mode) {
        struct fopen_struct args;
        args.filename = filename;
        args.mode = mode;
        args.callback = callback;
        pthread_t thread;
        pthread_create(&thread, NULL, &__fopen_t__, &args);
        //pthread_join ??
        return thread;
    }
    
    void *__fopen_t__(void *ptr) {
        printf("I am done!\n");
        struct fopen_struct *args = (struct fopen_struct *)ptr;
        FILE *result = fopen(args -> filename, args -> mode);
        args -> callback(result);
    }
    
    int main() {
        pthread_t thread = fopen_t(&fopen_callback, "test.txt", "r");
        printf("abc\n");
        //pthread_join ??
    }
    
    void *fopen_callback(FILE *stream) {
        if (stream != NULL)
            printf("Opened file successfully\n");
        else
            printf("Error\n");
    }
    If I do a pthread_join in fopen_t() it works perfectly fine. But if I do that in main() I get a segmentation fault error. I want to call it in main() because I want it to be non-blocking, is there any solution?

  2. #2
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    in line 20 you are passing pointer to local var args to pthread_create

    you fopen_t could exit before __fopen_t__ will read this memory
    as a result __fopen_t__ will access uninitialized memory.

    you need to use malloc to allocate args in fopen_t and free it in the __fopen_t__ after the data was read from the struct
    Salem likes this.
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. How to join this two together?
    By SuperMiguel in forum C Programming
    Replies: 7
    Last Post: 06-20-2012, 02:01 AM
  2. Euler Problem 10 With pthreads
    By deadrabbit in forum C Programming
    Replies: 6
    Last Post: 12-31-2011, 04:04 AM
  3. pthreads/arrays Problem
    By Jedel in forum C Programming
    Replies: 3
    Last Post: 10-15-2009, 07:21 AM
  4. Pthreads problem
    By maluyk in forum C Programming
    Replies: 4
    Last Post: 04-27-2007, 09:33 AM

Tags for this Thread


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21