![]() |
| | #1 |
| Registered User Join Date: May 2004
Posts: 19
| 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);
}
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);
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
Thank you! |
| Quasar is offline | |
| | #2 |
| and the hat of Jobseeking Join Date: Aug 2001 Location: The edge of the known universe
Posts: 21,630
| 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. |
| Salem is offline | |
| | #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. |
| Quasar is offline | |
| | #4 |
| Kernel hacker Join Date: Jul 2007 Location: Farncombe, Surrey, England
Posts: 15,686
| 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);
-- 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. |
| matsp is offline | |
| | #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;
Code:
void findDeficit(const Config *config, const CountryStruct *country, CountryDeficit *cdeficit, CountryMutex *cmutex) {
pthread_mutex_lock(&cmutex->resA);
...
pthread_mutex_unlock(&cmutex->resA);
}
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 Last edited by Quasar; 12-04-2007 at 07:58 AM. Reason: Wrong code |
| Quasar is offline | |
| | #6 |
| Kernel hacker Join Date: Jul 2007 Location: Farncombe, Surrey, England
Posts: 15,686
| 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. |
| matsp is offline | |
| | #7 |
| Registered User Join Date: May 2004
Posts: 19
| Sorry, missing &. Still the same problem, argh... Rebooting the server, maybe that works. |
| Quasar is offline | |
| | #8 | |
| Kernel hacker Join Date: Jul 2007 Location: Farncombe, Surrey, England
Posts: 15,686
| Quote:
-- 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. | |
| matsp is offline | |
![]() |
| Thread Tools | |
| Display Modes | |
|
Similar Threads | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Multiple source files in one project | mintsmike | C++ Programming | 8 | 06-27-2009 07:20 AM |
| Confusion on header and source files | dnguyen1022 | C++ Programming | 4 | 01-17-2009 03:42 AM |
| Working with multiple source files | abh!shek | C Programming | 17 | 06-03-2008 11:23 AM |
| Multiple Source Files!?!? | Padawan | C Programming | 14 | 04-04-2004 12:19 AM |
| Using multiple source files: Multiple Declarations & Wrong line numbers | Inquirer | C++ Programming | 1 | 05-01-2003 02:52 PM |