in reply to [Win32] differing threads behaviour

Thoughts ?

Duh ... anyone with half a brain would probably be sceptical that MCF threads are going to just magically work with perl without any need to modify the perl source.
The fact that my "mcf" build has a runtime dependency on libmcfgthread-1.dll was enough to fool me - but I think that my "mcf" build might very well be a "pthreads" one, and the difference I'm seeing is the result of a change between gcc-12.2.0 and gcc-13.0.1.

I'll work on reproducing the difference in a C program and take it up with the appropriate body.

Cheers,
Rob
  • Comment on Re: [Win32] differing threads behaviour

Replies are listed 'Best First'.
Re^2: [Win32] differing threads behaviour
by syphilis (Archbishop) on Apr 11, 2023 at 12:20 UTC
    I'll work on reproducing the difference in a C program and take it up with the appropriate body.

    I've arrived at:
    #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <mpfr.h> void *foo( void *ptr ); int main(void) { pthread_t thread1; char *message1 = "precision in thread1:"; int iret1; if(mpfr_buildopt_tls_p()) printf("mpfr was built with TLS support +\n"); else printf("mpfr was NOT built with TLS support\n"); mpfr_set_default_prec(101); iret1 = pthread_create( &thread1, NULL, foo, (void*) message1); pthread_join( thread1, NULL); printf("pthread_create() returned: %d\n",iret1); printf("Back in main: %d\n", mpfr_get_default_prec()); return 0; } void *foo( void * ptr) { char *message; message = (char *) ptr; mpfr_set_default_prec(201); printf("%s %d\n", message, mpfr_get_default_prec()); pthread_exit (NULL); }
    It exhibits the same 12.2.0-versus-13.0.l anomaly.
    If that C program is compiled using gcc-12.2.0, then the foo() sub reports that default precision is 201, but if it's compiled using gcc-13.0.1 then a default precision of 53 is reported.
    According to the mpfr developers, it should report 201.
    I'll see if I can get the mingw-w64 developers to shed some light on what's going awry.

    Cheers,
    Rob
      I'll see if I can get the mingw-w64 developers to shed some light on what's going awry.

      Liu Hao (lh_mouse) has provided the following explanation:
      It's because `__emutls_get_address()` returns two distinct values in c +onsecutive calls with the same descriptor in the same thread, so the second reference to the thread l +ocal `__gmpfr_default_fp_bit_precision` (defined in 'set_dfl_prec.c') gets +a fresh object with its default value.
      The "second reference" is the mpfr_get_default() call made in foo().
      He then followed that up with:
      Looks like emutls could not set the thread-specific value for 'foreign + threads' (those not created by mcfgthread). Although this is by design, I do think the MPFR expect +ation should be reasonably supported. I will fix this in a couple of days.
      Entire thread is at:
      https://sourceforge.net/p/mingw-w64/mailman/mingw-w64-public/thread/3a656408-a99f-e9c1-e4f0-c4ff8374bb30%40126.com/#msg37802424

      Here endeth this soliloquy ;-)

      Cheers,
      Rob