problem mutex-thread "Unlocking mutex owned by another thread ???"
Hello, i'm trying to program a thread that would be locked (by a
mutex) and that would only be unlocked once that a function
(generating data) is done. The purpose is to generate data, and unlock
the mutex in order to activate the thread once the data is generated.
I have to do it this way, i can only call the thread if the data are
generated.
********************************************************
step 1: initialize the mutex
mx (the mutex is part of the class "cl")
class Client
{
...
public:
pthread_mutex_t mx;
...
}
pthread_mutex_init(&cl->mx, NULL);
********************************************************
********************************************************
step 2:
as i'm calling a thread, i have to pass in param a structure with the
mutex :
struct S_PARAMS
{
...
pthread_mutex_t *mx;
...
} typedef T_PARAMS;
i create the thread and i copy the mutex in the param structure :
pthread_t thread;
params->mx = &cl->mx;
if ((thId = pthread_create(&thread, NULL, OBody::thFileSender, (void
*)params)) != 0)
{
THREAD NOT CREATED ... throw ...
}
else
{
I SET SOME FLAG TO KNOW MY THREAD HAS BEEN CREATED
}
********************************************************
********************************************************
step 3:
i lock my thread :
void *OBody::thFileSender(void *lpParam)
{
cout << "locking MUTX*****" << endl;
cout << pthread_mutex_lock(params->mx) << endl;
cout << "unlocked MUTX *****" << endl;
... (sending data)
}
********************************************************
********************************************************
step 4:
once i know my functions generating data are done, i call the thread
unlocking function.
cout << "*** before unlock ***" << endl;
pthread_mutex_unlock(&cl.mx);
cout << "*** after unlock ***" << endl;
********************************************************
Finally i get :
********************************************************
....
locking MUTX*****
0
unlocked MUTX *****
.... (generated data)
*** before unlock ***
server: Error detected by libpthread: Unlocking mutex owned by another
thread.
Detected by file "/root/netbsd-3.0/src/lib/libpthread/
pthread_mutex.c", line 347, function "pthread_mutex_unlock".
See pthread(3) for information.
....
********************************************************
What i understand is that the mutex is not locking the thread because
in the step3,
the "cout << "locking MUTX*****" << endl;" is done when is start the
program.
I put a sleep(10) in order to be sure that the thread was still
running without calling thread_unlock.
Moreover, when i try to unlock the thread, i get the error "Unlocking
mutex owned by another thread.".
all the mutex functions (init, lock, unlock) return 0 which mean that
the function are running correctly.
i have been working on this problem for hours and hours, i'm not a
specialist of the mutex/thread.
Thank you for your help.