3.7 Reentrancy
GMP is reentrant and thread-safe, with some exceptions:
-
If configured with ‘--enable-alloca=malloc-notreentrant’ (or with
‘--enable-alloca=notreentrant’ when
alloca is not available),
then naturally GMP is not reentrant.
-
mpf_set_default_prec and mpf_init use a global variable for the
selected precision. mpf_init2 can be used instead, and in the C++
interface an explicit precision to the mpf_class constructor.
-
mpz_random and the other old random number functions use a global
random state and are hence not reentrant. The newer random number functions
that accept a gmp_randstate_t parameter can be used instead.
-
gmp_randinit (obsolete) returns an error indication through a global
variable, which is not thread safe. Applications are advised to use
gmp_randinit_default or gmp_randinit_lc_2exp instead.
-
mp_set_memory_functions uses global variables to store the selected
memory allocation functions.
-
If the memory allocation functions set by a call to
mp_set_memory_functions (or malloc and friends by default) are
not reentrant, then GMP will not be reentrant either.
-
If the standard I/O functions such as
fwrite are not reentrant then the
GMP I/O functions using them will not be reentrant either.
-
It’s safe for two threads to read from the same GMP variable simultaneously,
but it’s not safe for one to read while the another might be writing, nor for
two threads to write simultaneously. It’s not safe for two threads to
generate a random number from the same
gmp_randstate_t simultaneously,
since this involves an update of that variable.