On Wed, 2017-05-31 at 23:54 +0200, Philippe Waroquiers wrote:
> If the problem is effectively linked to re-creation of
> another mutex at the same addr, then i think a small
> reproducer should be easy to write.

The below  small program reproduces the behaviour
you have seen: a race condition is reported between
2 threads while helgrind reports they are holding
the same lock.

But in reality, the lock was destroyed and re-created.
Helgrind falsely believes this to be the same lock
(and falsely reports that the first time the lock was observed
is the re-creation).

So, it is probable that what you see is a similar case.
In absence of another synchronisation than this (falsely
presented as a common) lock, you might have a real race
condition.

Philippe
 
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>

pthread_mutex_t mx1;
int x = 0;

void* child_fn ( void* arg )
{
   int r;
   int destroy;
   printf("child_fn\n");
   r= pthread_mutex_lock(&mx1);  assert(!r);
   x += 1;
   destroy = x == 1;
   r= pthread_mutex_unlock(&mx1);  assert(!r);
   if (destroy) {
      printf("destroy/recreate mx1\n");
      r= pthread_mutex_destroy(&mx1);  assert(!r);
      r= pthread_mutex_init(&mx1, NULL);  assert(!r);
   }
   printf("child_fn returning ...\n");
   return NULL;
}

void* child_fn2 ( void* arg )
{
   sleep (20);
   child_fn ( arg );
   return NULL;
}

int main ( int argc, char** argv )
{
   pthread_t child1, child2;
   int r;

   r= pthread_mutex_init(&mx1, NULL);  assert(!r);
   printf("creating threads\n");
   r= pthread_create(&child1, NULL, child_fn, NULL);  assert(!r);
   r= pthread_create(&child2, NULL, child_fn2, NULL);  assert(!r);
   printf("sleeping 5\n");
   sleep (5);

   printf("joining child1\n");
   r= pthread_join(child1, NULL);  assert(!r);
   printf("joining child2\n");
   r= pthread_join(child2, NULL);  assert(!r);
   printf("end\n");

   return 0;
}



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to