Thread: Mutex across multiple source files

  1. #1
    Registered User
    Join Date
    May 2004
    Posts
    19

    Unhappy Mutex across multiple source files

    Hi all!

    I'm working on a prog that uses mutexes. Since the code is growing bigger and bigger i decided to split it across multiple C and H files. To my surprise the mutexes stopped working!

    I have no idea why this happened.

    The general idea of the code is this:

    A function that receives the mutex in its argument:
    Code:
    void function(pthread_mutex_t mut) {
        pthread_mutex_lock(&mut);
        printf("This shows up if function is in the same source file as the calling code.");
        pthread_mutex_unlock(&mut);
    }
    The code that calls the function:
    Code:
    pthread_mutex_t mut;
    pthread_mutex_init(&mut, NULL);
    
    pthread_mutex_lock(&mut);
    printf("This shows up!");
    pthread_mutex_unlock(&mut);
    
    function(mut);
    
    pthread_mutex_destroy(&mut);
    Sample Makefile:
    Code:
    CC = gcc
    CFLAGS = -Wall -ansi -pedantic -g  -D _XOPEN_SOURCE=600
    OBJECTS = main.o function.o
    
    all: $(OBJECTS)
            $(CC) $(CFLAGS) -lpthread -lrt -lm -o main $(OBJECTS)
    
    main.o: main.c main.h
    function.o: function.c function.h
    
    clean:
            rm -f *.o main
    Does anyone have any idea why this happens, and how to solve it?

    Thank you!

  2. #2
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,660
    All other things being equal, splitting the source code into several files won't make a bean of difference.

    The final executable has no knowledge of the structure of the source code which created it.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  3. #3
    Registered User
    Join Date
    May 2004
    Posts
    19
    That's why i think it's a gcc problem, if i move the function to it's original place everything works!

    I was wondering if there something lika a -mutex-across-multiple-source-files i should pass to gcc.

  4. #4
    Kernel hacker
    Join Date
    Jul 2007
    Location
    Farncombe, Surrey, England
    Posts
    15,677
    No, it's not gcc's fault - or anyone elses. You are passing a COPY of the mutex to "function" - this mutex is NOT the same one that you were using in the other code.

    It's not because you are using multiple files, but simply that you are copying an existing mutex, and making it a different mutex.

    Code:
    void function(pthread_mutex_t *mut) {
        pthread_mutex_lock(mut);
        printf("This shows up if function is in the same source file as the calling code.");
        pthread_mutex_unlock(mut);
    }
    ...
    function(&mut);
    should work.


    --
    Mats
    Compilers can produce warnings - make the compiler programmers happy: Use them!
    Please don't PM me for help - and no, I don't do help over instant messengers.

  5. #5
    Registered User
    Join Date
    May 2004
    Posts
    19
    It's more complicated that that. I simplified the example...

    I'm passing this structure:

    Code:
    typedef struct {        /* Country mutex structure */
            pthread_mutex_t resA, resE, resP, resM;
            pthread_mutex_t purchase1, purchase2;
    } CountryMutex;
    Into this function:
    Code:
     
    void findDeficit(const Config *config, const CountryStruct *country, CountryDeficit *cdeficit, CountryMutex *cmutex) {
    pthread_mutex_lock(&cmutex->resA);
    ...
    pthread_mutex_unlock(&cmutex->resA);
    }
    Using this call:
    Code:
    CountryMutex cmutex;
    pthread_mutex_init(&cmutex.resA, NULL);
    pthread_mutex_init(&cmutex.resE, NULL);
    pthread_mutex_init(&cmutex.resP, NULL);
    pthread_mutex_init(&cmutex.resM, NULL);
    
    findDeficit(config, country, cdeficit, &cmutex);   << EDIT
    Shouldn't this work? Passing a pointer to a structure of mutexes?
    Last edited by Quasar; 12-04-2007 at 07:58 AM. Reason: Wrong code

  6. #6
    Kernel hacker
    Join Date
    Jul 2007
    Location
    Farncombe, Surrey, England
    Posts
    15,677
    Your calling code doesn't look like it's passing pointers, so I'm not sure if it's at all working - but yes, passing a structure pointer that contains mutexes should work. The point is that you can't make copies of a mutex and still think that it's the same mutex.

    --
    Mats
    Compilers can produce warnings - make the compiler programmers happy: Use them!
    Please don't PM me for help - and no, I don't do help over instant messengers.

  7. #7
    Registered User
    Join Date
    May 2004
    Posts
    19
    Sorry, missing &.

    Still the same problem, argh...

    Rebooting the server, maybe that works.

  8. #8
    Kernel hacker
    Join Date
    Jul 2007
    Location
    Farncombe, Surrey, England
    Posts
    15,677
    Quote Originally Posted by Quasar View Post
    Sorry, missing &.

    Still the same problem, argh...

    Rebooting the server, maybe that works.
    Rebooting the server doesn't sound like the right thing - mutexes should be "infinite" resources [as in, they are only limited by amount of memory, so if you can create the mutex itself, you can use the mutex].

    --
    Mats
    Compilers can produce warnings - make the compiler programmers happy: Use them!
    Please don't PM me for help - and no, I don't do help over instant messengers.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Multiple source files in one project
    By mintsmike in forum C++ Programming
    Replies: 8
    Last Post: 06-27-2009, 07:20 AM
  2. Confusion on header and source files
    By dnguyen1022 in forum C++ Programming
    Replies: 4
    Last Post: 01-17-2009, 03:42 AM
  3. Working with multiple source files
    By abh!shek in forum C Programming
    Replies: 17
    Last Post: 06-03-2008, 11:23 AM
  4. Multiple Source Files!?!?
    By Padawan in forum C Programming
    Replies: 14
    Last Post: 04-04-2004, 12:19 AM
  5. Replies: 1
    Last Post: 05-01-2003, 02:52 PM