pthread_cond_wait
Polina Dudnik
pdudnik@cs.wisc.edu
Wed Jul 16 21:22:00 GMT 2008
Hi,
Thank you for the reply. I have made an attempt at implementing a
mutex-less pthread_cond_wait and pthread_cond_signal.
Specifically I am using futexes to implement it (below).
I define a global integer initialized to zero, which is my futex.
So, my cond_wait function looks like this:
int rn = lll_futex_wait(&event, event);
cond_wait looks like this:
GetLock(&lock, threadid+1);
event++;
ReleaseLock(&lock);
lll_futex_wake(&event, INT_MAX);
And cond_broadcast looks like this:
GetLock(&lock, threadid+1);
event++;
ReleaseLock(&lock);
lll_futex_wake(&event, 1);
However, I am still loosing signals and I don't know why. If anybody is
strong with futexes, I would really appreciate any information. Thanks.
#define lll_futex_wait(futex, val) \
({ \
register const struct timespec *__to __asm ("r10") = NULL;
\
int __status; \
register __typeof (val) _val __asm ("edx") = (val); \
__asm __volatile ("syscall" \
: "=a" (__status) \
: "0" (SYS_futex), "D" (futex), \
"S" (FUTEX_WAIT), \
"d" (_val), "r" (__to) \
: "memory", "cc", "r11", "cx"); \
__status; \
})
#define lll_futex_wake(futex, nr) \
do { \
int __ignore; \
register __typeof (nr) _nr __asm ("edx") = (nr); \
__asm __volatile ("syscall" \
: "=a" (__ignore) \
: "0" (SYS_futex), "D" (futex), \
"S" (FUTEX_WAKE), \
"d" (_nr) \
: "memory", "cc", "r10", "r11", "cx"); \
} while (0)
Gilles Carry wrote:
> Polina Dudnik wrote:
>> Hi,
>>
>> I would like to write my own version of pthread_cond_wait, which
>> doesn't have a mutex as one of it's parameters, to be used with
>> transactional memory model. I am not sure why it is important to have
>> the mutex locked before calling lll_lock (cond->__data.__lock,
>> pshared). What would happen if the mutex was unlocked before calling
>> lll_lock (cond->__data.__lock, pshared). Thanks.
>
> Hi,
> As far as I remember, the external mutex is to avoid loss of signals.
> Releasing the external mutex before the internal one would let a time
> window
> in which a signal could be issued before the waiter is put into the
> waiting queue.
> Anyway, before modifying pthread_cond_* stuff, you should carefully read
> this:
> http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_wait.html
>
> and especially "Features of Mutexes and Condition Variables".
>
> Hope this helps.
>
> Gilles.
More information about the Libc-help
mailing list