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
変数を使って同時に乱数を生成すると,同時にこの変数をアップデートしてしまいますので,スレッドセーフではなくなります。