再入可能性GMPは再入可能(reentrant)かつスレッドセーフですが,次の例外があります。--enable-alloca=notreentrant)を使ってコンパイルすると,当然GMPは再入可能ではなくなります。mpf_set_default_prec関数とmpf_init関数は精度指定のためにグローバル変数を使ってしまいます。代わりとして,mpf_init2や,C++での明示的なmpf_classコンストラクタへの精度指定が使用可能です。mpz_random関数と,他にも古い乱数関数はグローバル変数を使うので,結果として再入可能ではなくなります。gmp_randstate_t型のパラメータを受け付ける新しい乱数関数をその代わりに使うことが可能です。関数(廃止予定)はグローバル関数を介したエラー表示を行うのでスレッドセーフではありません。その代わり,gmp_randinit_default関数やgmp_randinit_lc_2exp関数の使用をお勧めします。mp_set_memory_functions関数はグローバル変数を使って指定されたメモリ割り当て関数名を保存しています。メモリ割り当て関数がmp_set_memory_functions関数(もしくはmalloc関数とその仲間)で指定でされていて再入可能でなければ,GMPも再入可能でなくなります。fwrite関数のように標準I/O関数が再入可能でなければ,それを使っているGMPのI/O関数も再入可能でなくなります。二つのスレッドで同時にGMPの変数を読み出すことはできますが,片方が書きこんでいる時にもう片方が読み出したり,同時に書き込みを行うとスレッドセーフではなくなります。二つのスレッドで同じgmp_randstate_t変数を使って同時に乱数を生成すると,同時にこの変数をアップデートしてしまいますので,スレッドセーフではなくなります。