This is the mail archive of the pthreads-win32@sourceware.org mailing list for the pthreas-win32 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Pthread-win32 races?


Hi Sergey,

The library is working correctly since sem_destroy() is returning the error EBUSY as required and documented at:

http://sourceware.org/pthreads-win32/manual/sem_init.html

This is also in accordance with the Single Unix Specification. If it was hanging your program rather than returning the error then that would be a problem.

By the way, in your sample code you don't check the return code from the sem_post(), but the semaphore could already be destroyed at that point. It would be better in this and similar cases to call sem_destroy() after the call to pthread_join(), or at least after you can guarantee that the semaphore is no longer required by any child threads.

A sem_t "handle" is not required to be unique in time, so it's possible to destroy a semaphore and init a new one having another purpose altogether, which then by chance occupies the same physical memory location, i.e. has the same "handle" (in pthreads-win32 this is just the pointer to the struct in memory), so a sema op somewhere may not fail even though, logically, it is no longer accessing the semaphore it should be, and the application may now be mysteriously badly behaved and difficult to debug.

Regards.
Ross

Sergey Fokin wrote:
Hi all.

I have some peculiarities with pthread-win32 and suppose there's a bug
in library.

Here's my example code:

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <assert.h>

void * thr(void * arg)
{
 sem_post((sem_t*)arg);
 return 0;
}

int main()
{
   sem_t sem;
   int error = 0;
   error = sem_init(&sem, 0, 0); // OK
   assert(!error);

   pthread_t thread;
   error = pthread_create(&thread, 0, thr, &sem); // OK
   assert(!error);

   sem_wait(&sem);
   error = sem_destroy(&sem);
   if (error != 0)
   {
       error = errno; // errno == 16 (EBUSY)
       printf("errno = %d\n", error);
   }

pthread_join(thread, 0);

   return error;
}


So, here we have error 16 (0x10) in almost all runs, independently on compile options (at least i couldn't find working combination). Compiler is msvc 7.1 sp1.

I've read about some troubles with it in BUGS file, but first, this
one is unrelated to those, as I can see, second all tests from `tests'
directory run with no errors, but this one fails even with same
compile options.

When I've tried to debug, it turned out that when main() is executing
sem_destroy(), child thread is still in sem_post(). But I couldn't
find out what's going on there and supposed this is some kind of race,
this is why subject is about races.

Google didn't find similar issues about pthread-win32 library.

Really hope, this is my fault, but I have no idea where I'm wrong.

Thanks in advance.

PS I'll also try gcc for win32 and msvc8.0 later - I don't have them
on this computer.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]