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