マルチスレッドプログラムの複数のスレッドに、データ競合を発生させずに同一のライブラリを利用させる情報処理装置であって、前記ライブラリより複数のインスタンスを生成し、前記複数のインスタンスをメモリ空間にロードするライブラリロード部と、前記ライブラリロード部が生成した前記複数のインスタンスを、前記複数のスレッドに割当てる割当処理部とを含む情報処理装置。前記ライブラリロード部は、同一の前記ライブラリから、毎度異なるインスタンスを生成する処理を行うことにより、前記新たなインスタンスを生成する請求項1記載の情報処理装置。前記ライブラリロード部は、前記ライブラリと同一内容の複製ライブラリであって、毎度異なる前記複製ライブラリからインスタンスを生成する処理を行うことにより、前記新たなインスタンスを生成する請求項1記載の情報処理装置。前記割当処理部は、前記スレッドの識別子と、前記インスタンスに含まれるシンボル又は変数のうち少なくともいずれか一方のアドレスとを対応付けて保持することにより、前記割当てを行う請求項1乃至3いずれか1項記載の情報処理装置。前記割当処理部は、前記アドレスを格納した構造体であって、前記スレッドそれぞれに対して生成されるものであり、前記スレッドは、前記構造体を参照することにより前記アドレスを取得する請求項4記載の情報処理装置。前記割当処理部は、アドレス表及びラッパー関数を含み、前記アドレス表は、前記スレッドの識別子と前記アドレスとを対応付けて記録しており、前記ラッパー関数は、指定された前記スレッドの識別子に対応する前記アドレスを取得するものであり、前記スレッドは、前記ラッパー関数を実行することにより前記アドレスを取得する請求項4記載の情報処理装置。マルチスレッドプログラムの複数のスレッドに、データ競合を発生させずに同一のライブラリを利用させる情報処理方法であって、前記ライブラリより複数のインスタンスを生成し、前記複数のインスタンスをメモリ空間にロードするロード処理と、前記複数のインスタンスを、前記複数のスレッドに割当てる割当処理とを含む情報処理方法。前記ロード処理は、同一の前記ライブラリから、毎度異なるインスタンスを生成する処理を行うことにより、前記新たなインスタンスを生成するものである請求項7記載の情報処理方法。前記ロード処理は、前記ライブラリと同一内容の複製ライブラリであって、毎度異なる前記複製ライブラリからインスタンスを生成する処理を行うことにより、前記新たなインスタンスを生成するものである請求項7記載の情報処理方法。前記割当処理は、前記スレッドの識別子と、前記インスタンスに含まれるシンボル又は変数のうち少なくともいずれか一方のアドレスとを対応付けて保持することにより、前記割当てを行うものである請求項7乃至9いずれか1項記載の情報処理方法。データ競合の他の解決策としては、図23に示すように、関数func0とfunc1とが同時に実行されないよう、複数のスレッドが協調して動作するようにプログラムのソースコード修正する手法も考えられる。図22及び図23に示したようなデータ競合の解決手法は、いずれもプログラムのソースコードが必要であるという点において共通する。一方で、このようなデータ競合が、プログラムが利用するライブラリで起こることが問題となる場合がある。ライブラリとは、再利用可能なコード群であって、プログラムから呼び出されることにより実行可能となるコード群をいう。ここでいうコードとは、ソースコード、オブジェクトコード又は他の任意の形式のものであってよい。一般に、ライブラリはライブラリファイルの形で記憶装置上に配置されているが、実行時にはライブラリファイルのインスタンスがメモリ空間上に配置される。プログラムは、メモリ空間におけるライブラリのインスタンスのアドレスを指定することにより、ライブラリの関数及び変数等にアクセスすることができる。図24に、マルチスレッドプログラム内の複数のスレッドが、2つのライブラリ関数を同時に呼び出した場合に問題が起こる例を示す。2つのライブラリ関数func0及びfunc1は、いずれも同一のグローバル変数にアクセスするものである。このfunc0とfunc1とが別々のスレッドで実行されると、データ競合が発生する。複数のスレッドから呼び出された場合にも正しく動作するように作られたライブラリは、スレッドセーフなライブラリと呼ばれ、このようなライブラリのみを利用する場合は、上述のようなライブラリ内でのデータ競合は起こらない。しかしながら、必ずしもプログラムが利用するライブラリすべてがスレッドセーフであるとは限らない。そのため、マルチスレッドプログラムの開発者は、プログラムが利用するライブラリがスレッドセーフであるかを常に把握し、スレッドセーフでない場合にはデータ競合に対応させるための修正を行う必要があった。ライブラリがスレッドセーフでない場合の対応策として、図23において示したように、ライブラリ関数を同時に呼び出さないよう、複数のスレッドが時間的に協調して動作するようにプログラムを変更する方法がある。但し、この方法には、ライブラリ関数を同時に呼び出すことができなくなること、ライブラリ関数を呼び出すたびに、他のスレッドが同じ関数を実行していないかをチェックするためのオーバヘッドがかかるため、性能が低下する可能性があることといった欠点がある。また、ライブラリがスレッドセーフでない場合の他の対応策として、ライブラリのデータ競合自体を解決する方法がある。すなわち、図22において示したようなソースコードの修正をライブラリに対して行うことによって、ライブラリをスレッドセーフに変更することができる。しかしながら、この方法には、ライブラリのソースコードが必ずしも利用できるとは限らないという欠点がある。ライブラリのソースコードが利用出来ない場合は、特許文献1にみられるような、コンパイラによるプライベート化を行うこともできない。本発明は、このような問題点を解決するためになされたものであり、複数のスレッド間でのデータ競合を解決することができる情報処理装置及び情報処理方法を提供することを目的とする。本発明に係る情報処理装置は、マルチスレッドプログラムの複数のスレッドに、データ競合を発生させずに同一のライブラリを利用させる情報処理装置であって、前記ライブラリより複数のインスタンスを生成し、前記複数のインスタンスをメモリ空間にロードするライブラリロード部と、前記ライブラリロード部が生成した前記複数のインスタンスを、前記複数のスレッドに割当てる割当処理部とを含むものである。また、本発明にかかる情報処理方法は、前記ライブラリより複数のインスタンスを生成し、前記複数のインスタンスをメモリ空間にロードするロード処理と、前記複数のインスタンスを、前記複数のスレッドに割当てる割当処理とを含むものである。本発明により、複数のスレッド間でのデータ競合を解決することができる情報処理装置及び情報処理方法を提供することができる。以下、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。<実施の形態1>本実施の形態は、本発明を、ライブラリがプログラムにダイナミックリンクされる場面に適用したものある。ここで、ダイナミックリンクとは、プログラムの実行時に、プログラムに必要なライブラリが、より具体的にはライブラリファイルから生成されたインスタンスが、プログラムのメモリ空間内にロードされ、かつシンボルのアドレス解決が行われる方式である。シンボルのアドレス解決とは、ライブラリ中のシンボル関数名などと、プログラムのメモリ空間上のアドレスの対応関係を決定することをいう。このように、アドレス解決を行うことによってはじめて、プログラムはライブラリの関数等を利用することが可能となる。ダイナミックリンクにおいては、ライブラリ中のシンボルのアドレスは、ライブラリがロードされるまで確定されず、アドレスの解決はプログラムの実行時に行われる。はじめに、図1を用いて、本発明の実施の形態1にかかる情報処理装置100の基本的な構成について説明する。情報処理装置100は、ライブラリロード部101と割当処理部102とを有する。ライブラリロード部101は、ライブラリファイルから複数のインスタンスを生成し、それらのインスタンスをメモリ空間にロードする処理を行う処理部である。割当処理部102は、ライブラリロード部101が生成した複数のインスタンスを、それぞれ複数のスレッドに割当てる処理を行う処理部である。上記101乃至102はいずれも、図示しない記憶手段に格納された各種コンピュータプログラムに基づいて各種制御を実行する機能を有しており、具体的には中央演算処理装置CPU、読出専用メモリROM、ランダムアクセスメモリRAM、入出力ポートI/O等により実現されるものである。図2を用いて、情報処理100のより具体的な実装例について説明する。ライブラリロード部101としては、例えばUNIX登録商標などで利用可能なモジュールであって、動的リンクを行うローダへのインタフェースであるlibdlを用いることができる。libdlは、ライブラリの動的ロードを行うための、いくつかの関数を提供しているライブラリである。libdlを利用することにより、簡易にライブラリの動的ロードが行えるという利点がある。libdlはUNIX登録商標システムでは広く利用されており、当業者には良く知られている。通常libdlはdlopenと呼ばれる関数を提供する。dlopenは、指定されたライブラリファイルをプロセスのメモリ空間にロードする処理を行う。通常、dlopenは、同一のライブラリファイルを指定した2度目以降のロード要求に対しては、ライブラリの再ロードは行わず、最初の実行時にロードしたライブラリをそのまま利用する。一方、本実施の形態では、このdlopenに代えて、dlmopenと呼ばれる関数を用いてライブラリの動的ロードを行う。dlmopenは、同一のライブラリファイルを複数回ロードし、プログラム中の別の領域にマップする機能を有する。また、libdlは、dlsymと呼ばれる、ロードしたライブラリ内のアドレスを解決するための関数も提供しており、本実施の形態では、アドレス解決のためにこの関数を利用する。また、ライブラリロード部101が用いるライブラリファイルとしては、例えばライブラリのソースコードをコンパイルして得られた実行可能オブジェクトを格納したファイルとすることができる。本実施の形態では、このライブラリファイルは通常記憶装置に格納され、必要に応じライブラリロード部101によって読み出される。ライブラリロード部101は、このライブラリファイルを用いて、毎度新たなライブラリインスタンスを生成し、ロードする機能を有する。すなわち、ライブラリインスタンスを、プログラムのメモリ空間上の都度異なる領域にマップし、そのライブラリインスタンスのシンボルのアドレス解決を行う。本実施の形態では、このように、同一のライブラリがメモリ空間上に複数ロードされ得ることが特徴である。図3に、ライブラリファイルの具体例libsample.soを示す。libsample.soは、関数func0及びfunc1を含む。func0及びfunc1は、まずグローバル変数xに値を設定し、それぞれ関数func00又はfunc11を呼び出す。func00及びfunc11は、それぞれxを用いて所定の演算を行う関数であり、func0及びfunc1はその結果を受取って呼出し元に返す。なお、図3ではfunc00及びfunc11の内容は省略している。本実施の形態では、ライブラリロード部101は、ロード制御部により呼び出されて実行される。図4に、呼出元であるロード制御部の具体例library_loadを示す。ロード制御部は、libdlのdlmopen関数を呼び出して、ライブラリファイルfilenameをロードする。次に、dlsym関数を呼び出して、ライブラリインスタンスp内の関数func0及びfunc1のアドレスを解決し、新たに生成したアドレス構造体hに設定して、呼出し元に返す。なお、アドレス構造体hについては後述する。本実施の形態におけるロード制御部は、このようにdlmopenを利用している。そのため、ロード制御部は起動される度に新たなライブラリインスタンスpを生成する。この際、アドレス構造体hに格納される関数func0及びfunc1のアドレスも、毎回異なるアドレスとなる。本実施の形態では、ロード制御部はスレッド生成部が出すロード要求に応じて実行される。スレッド生成部は、マルチスレッドプログラムにおける複数のスレッドを生成する機能とともに、それぞれのスレッドを生成する際にロード制御部に対してロード要求を出す機能を備えている。このとき、スレッド生成部は、ロードを要求したスレッドの識別子をロード制御部に対して通知することとしてもよい。ロード制御部は、スレッド制御部からこのロード要求を受けると、ライブラリロード部101を起動し、ライブラリをロードさせる。また、ロード制御部は、ライブラリロード部101が解決したアドレスをライブラリロード部101から取得し、割当処理部102に通知する機能を備えていてもよい。図5に、スレッド生成部の具体例を示す。本実施の形態におけるスレッド生成部は、2つのスレッドを生成するものとする。よって、スレッド生成部は、ライブラリlibsample.soを2回ロードする。そのため、スレッド生成部は、ロード制御部library_load関数を2度呼出す。上述したように、ロード制御部は、それぞれのスレッド用のライブラリインスタンスを生成し、それぞれライブラリインスタンスの関数func0及びfunc1のアドレスを格納した、アドレス構造体を返す。つぎに、スレッド生成部はthread_create関数を2回実行して、スレッド0及び1を生成する。ここで、thread_create関数の引数は、生成したスレッドが実行すべき関数と、その関数に渡すべき引数を示している。本実施の形態では、生成されたスレッドそれぞれに対し、ロード制御部が生成した構造体hを引数として引渡している。図6に、スレッド生成部により生成されたスレッド内における、ライブラリの関数の実行例を示す。thread_main0及びthread_main1は、それぞれスレッド0及び1が実行する関数である。スレッド0及び1は、上記関数内において、それぞれアドレス構造体hに格納されている関数func0又はfunc1のアドレスを指定することにより、func0又はfunc1を実行する。ここで、スレッド0及び1が参照するアドレス構造体hはそれぞれ別のものである。また、これらのアドレス構造体は、それぞれ異なるライブラリインスタンス内の関数func0及びfunc1のアドレスを格納している。そのため、これらの2つのスレッドは、別々のライブラリインスタンス内の関数func0又はfunc1を呼出すことになる。また、ライブラリ関数func0及びfunc1がアクセスするグローバル変数もそれぞれのライブラリインスタンス内にある。そのため、これらの2つのスレッドは、データ競合を発生させずに、ライブラリを利用することができる。図6では、2つのスレッドは、それぞれライブラリ関数func0やfunc1を実行している。ここで、ライブラリ関数func0及びfunc1は、いずれももグローバル変数xに値を設定する処理を行うものとする。この場合、もしライブラリインスタンスが1つしかなければ、2つのスレッドが同時に実行されると、一方のスレッドがグローバル変数xを設定することによって、他方のスレッドが既にグローバル変数x設定したデータが上書きされてしまう可能性がある。すなわちデータ競合が起こる。このとき、グローバル変数xを利用して計算を行うfunc00及びfunc11では、演算の途中で意図せずグローバル変数xの値が変わってしまうことになるため、本来得られるべき処理結果とは異なる処理結果が得られることとなり、結果としてプログラムが誤動作する可能性がある。しかしながら、本実施の形態では、上述のように各スレッドで異なるライブラリインスタンスを利用する。すなわち、func0及びfunc1が利用するグローバル変数xは、それぞれ異なる領域に格納された、別の実体を有する変数である。そのため、上述のようなデータ競合は発生しない。したがって、2つスレッドで同時にfunc0やfunc1を実行したとしても、プログラムが誤動作することはない。このように、本実施の形態では、ライブラリ自体には特別な変更を加えることなく、スレッドセーフではないライブラリをマルチスレッドプログラムで用いることができる。そのため、ライブラリを利用するプログラマの負担を抑えることができる。図7に、上述のスレッド生成部により生成される2つのスレッドを含むマルチスレッドプログラムのメモリマップを示す。メモリ空間には、2つのライブラリインスタンス0及び1がロードされており、それぞれのライブラリインスタンスは、グローバル変数x、関数func0及びfunc1を備えていることがわかるfunc00及びfunc11は省略する。割当処理部102は、複数のスレッドそれぞれが、異なるライブラリインスタンスを利用できるように、スレッドがライブラリインスタンスとの対応関係を制御する機能を有する。本実施の形態では、割当処理部102は、ロード制御部から、解決済みのアドレスと、このアドレスを利用するスレッドの識別子とを受取り、これらの情報を対応付けて保持することにより、上記制御を行う。より具体的には、割当処理部102は、ライブラリインスタンスに対応して生成されるアドレス構造体として実現される。アドレス構造体は、解決済みのアドレス、すなわちライブラリインスタンス内の関数や変数にアクセスするためのアドレスを格納する。なお、割当処理部102は、上記アドレス等をロード制御部から受取るのみでなく、他の任意の方法により取得してもよい。図8に、上述のアドレス構造体の具体例を示す。このアドレス構造体は、ライブラリインスタンス中の関数func0及びfunc1のアドレスを格納することができる。つぎに、本発明の実施の形態1にかかる情報処理装置100の処理手順について説明する。まず、図9に、ライブラリをロードする処理の例を示す。S101:マルチスレッドプログラムが、スレッド生成部に対してスレッド生成要求を行う。スレッド生成部は、このスレッド生成要求を受取ると、ロード制御部に対してライブラリのロードを要求する。このロード要求は、生成すべきスレッドの数だけ繰返し行われる。好ましくは、スレッド生成部は、ロード要求の際、ロード制御部にスレッド識別子を通知する。S102:ロード制御部が、ライブラリロード部101に対して、ライブラリのロードを要求する。S103:ライブラリロード部101は、記憶手段からライブラリファイルを読出し、新たなライブラリインスタンスを生成し、プログラムプロセスのメモリ空間にロードする。S104:ロード制御部は、ロードされたライブラリに含まれる、外部からアクセス可能なシンボル、すなわち公開されているシンボルのアドレスを、ライブラリロード部101に問合せる。ここで、シンボルとは、ライブラリに含まれる関数及び変数等のことである。ライブラリロード部101は、上記シンボルのアドレスをロード制御部に返答する。ロード制御部は、割当処理部102に対して、特定のスレッド識別子で識別されるスレッドと、上記手順で得られたアドレスとを通知する。割当処理部102は、上記スレッドと上記アドレスをと対応付けて保持する。この対応付けは、公開されているすべてのシンボルに対して行われる。対応付けが終了したなら、ロード制御部は、スレッド生成部に対して、ライブラリのロードが完了したことを通知する。S105:スレッド生成部は、マルチスレッドプログラムにより指示された数のスレッドを生成する。以上の一連の処理により、スレッドが生成されるたびに、スレッド固有のライブラリインスタンスがプロセスのメモリ空間にロードされる。なお、本実施の形態では、エラー処理例えば存在しないライブラリのロードを要求した場合等の処理に関する説明を省略しているが、適宜エラー処理を行うことが好ましい。つづいて、図10を用いて、生成されたスレッドがライブラリを呼出す処理について説明する。なお、スレッドがライブラリを呼出すとは、スレッドがライブラリ内の関数を実行すること、及びライブラリ内の変数にアクセスすることをいう。S106:スレッドは、割当処理部102を用いて、スレッド自身のスレッド識別子と実行したいシンボルの識別子とに基づき、スレッド自身に対応付けられたライブラリインスタンス内のシンボルのアドレスを決定する。S107:スレッドは、決定した上記アドレスを用いてライブラリを呼出す。すなわち、ライブラリ呼出しが関数呼出しの場合は、決定したアドレスにある関数を実行する。また、ライブラリ呼出しが変数への読み書きの場合は、決定したアドレスへの読書きを行う。このように、スレッド識別子を用いてライブラリ呼出しに必要なアドレスを決定することで、スレッド毎に異なるライブラリインスタンスを呼出すことができる。図11に、本実施の形態によってライブラリ関数を実行した場合と、本実施の形態によらずスレッドを同期させた場合、すなわち複数のスレッドで同時にライブラリ関数が呼出されないように制御した場合との動作を比較して示す。スレッドの同期を用いる場合には、一方のスレッドがライブラリ関数の実行を終了するまで、他方のスレッドはライブラリ関数の実行を待機することになる。一方、本実施の形態では、2つのスレッドが同時にライブラリ関数を実行する。よって、本実施の形態の方が、ライブラリ関数の実行を早く終了させることができる。このように、本発明によれば、スレッドセーフでないライブラリを用いる際の性能低下を抑えることができる。本実施の形態では、スレッド生成部は、ライブラリのロードが完了した後にスレッドを生成したが、スレッドの生成を先に行っても良い。この場合、生成されたスレッドが、ライブラリのロードが終わるより前にライブラリを呼出すことがないよう、適切な処理を行う必要がある。また、本実施の形態では、ロード制御部は、ライブラリがロードされた際に、ロードされたライブラリのシンボルのアドレスを割当処理部102に通知したが、この通知はスレッドがライブラリを呼出した際に行ってもよい。この場合、割当処理部102が、ライブラリロード部101を呼出し、ライブラリのインスタンス内のシンボルのアドレスを解決するという動作を行う必要がある。これにより、ライブラリのロード時にシンボルのアドレス解決に掛かる時間を省けるため、ライブラリのロードを短時間で行うことができるという効果がある。さらに、本実施の形態では、ライブラリが公開しているすべてのシンボルについてアドレス解決を行ったが、スレッドが利用するライブラリのシンボルが一部に限られている場合は、そのシンボルのみアドレスの解決を行うこととしてもよい。この場合、あらかじめスレッドが呼び出す可能性があるシンボルを所定の記憶領域に書き出すなどしてライブラリロード部101やロード制御部に把握させる必要が生じる。一方、これにより、アドレス解決に必要な処理を少なくすることができるという効果がある。また、本実施の形態では、ライブラリの全体をプロセスのメモリ空間の複数の領域にマップしたが、ライブラリの一部だけを複数の領域にマップするようにしてもよい。例えば、データ競合が発生する関数だけ複数の領域にマップして別々のスレッドから利用可能とし、データ競合が発生しない関数は、すでにマップされた領域内の関数を利用することができる。この場合、あらかじめデータ競合が発生する可能性のあるシンボルを所定の記憶領域に書き出すなどしてライブラリロード部101やロード制御部に把握させる必要が生じる。一方、これにより、メモリ空間上でライブラリインスタンスが占める領域のサイズを少なく抑えることができる。さらに、本実施の形態では、スレッド生成時にライブラリをロードする例を示したが、ライブラリのロードのタイミングは、技術的に可能とされる他の適宜のタイミングであってよい。また、本実施の形態では、説明を簡潔にするために、プログラムが1つのライブラリを利用する場合を例として説明したが、本発明はこれにとどまらず、複数のライブラリを用いる場合にも利用し得る。複数のライブラリを利用する場合には、プログラムが利用するすべてのライブラリに対して本実施の形態を適用しても良く、また特定のライブラリスレッドセーフではないライブラリなどに対して本実施の形態を適用しても良い。本実施の形態においては、ロード制御部がライブラリロード部101を用いてスレッド毎にライブラリインスタンスを生成し、割当処理部102がスレッドとライブらいインスタンスとの対応関係を管理することにより、スレッドセーフではないライブラリを用いる場合であっても、ライブラリ内でのデータ競合を発生させることなく、マルチスレッドプログラムを正しく動作させることができる。また、本実施の形態においては、ライブラリのソースコードを修正することなく、ライブラリ内でのデータ競合を解決できるため、プログラマの負担を軽減することができる。さらに、本実施の形態においては、マルチスレッドプログラムでスレッドセーフでないライブラリを用いる際に同期処理を用いないため、同期処理に必要なロックによるオーバヘッドを軽減でき、プログラムの性能を向上させることができる。<実施の形態2>つぎに、図12を用いて、本発明の実施の形態2にかかる情報処理装置100の構成について説明する。本実施の形態の情報処理装置100も、上述の実施の形態1と同様に、ライブラリロード部101と割当処理部102とを有する。本実施の形態のライブラリロード部101は、同一のライブラリファイルを複数回ロードする機能を備えないことを特徴とする。すなわち、ライブラリロード部101は、1つのライブラリファイルに格納されたライブラリを1回のみロードするため、メモリ空間上の複数の領域にロードすることはない。かかる機能は、具体的には、上述のdlopen関数を用いることにより実現することができる。また、ライブラリロード部101は、実施の形態1と同様に、ロードされたライブラリのシンボルのアドレスを解決行う機能を有する。また、本実施の形態は、ライブラリファイルが複数存在することを特徴とする。これらのライブラリファイルは、いずれも同じライブラリを格納したライブラリファイルである。これらのライブラリファイルは、例えばライブラリファイルを複製することによって作成することができる。また、ライブラリファイルは、プログラムが利用するスレッドの数だけ複製されることが望ましい。この複製は、スレッド生成部が行ってもよく、ライブラリロード部101が行ってもよく、あるいは他の任意の処理部が適宜行うこととしてもよい。図13に、本実施の形態におけるスレッド生成部の具体例を示す。本実施例のライブラリロード部101は、1つのライブラリファイルから複数のライブラリインスタンスを生成することができない。そのため、スレッド生成部は、ロード制御部library_load関数に、異なるファイル名を指定してライブラリのロード要求を行っている。なお、スレッド生成部はロード制御部に対して同一のライブラリファイル名を指定し、ロード制御部が都度異なるファイル名をライブラリロード部101に対して指定することとしてもよい。ここで、異なるライブラリファイルの指定方法としては、例えば、ライブラリファイルの使用履歴を利用して未使用のライブラリファイルを選択する方法、使用後のライブラリファイルを破棄して再使用不能とする方法、スレッド識別子に対応したライブラリファイルをあらかじめ生成しておき、ロード要求を行ったスレッドのスレッド識別子に対応するライブラリファイルを使用する方法等が考え得るが、他の任意の方法を用いることとしてもよい。つづいて、本発明の実施の形態2にかかる情報処理装置100の処理手順について説明する。図9を用いて、ライブラリをロードする処理の例を示す。本実施の形態の特徴的な処理は、ロード処理S103である。S101:マルチスレッドプログラムが、スレッド生成部に対してスレッド生成要求を行う。スレッド生成部は、このスレッド生成要求を受取ると、ロード制御部に対してライブラリのロードを要求する。このロード要求は、生成すべきスレッドの数だけ繰返し行われる。好ましくは、スレッド生成部は、ロード要求の際、ロード制御部にスレッド識別子を通知する。S102:ロード制御部が、ライブラリロード部101に対して、ライブラリのロードを要求する。ここで、ロード制御部は、毎回異なるライブラリファイルを指定して、ライブラリロード部101にライブラリインスタンスの生成を指示する。S103:ライブラリロード部101は、記憶手段からライブラリファイルを読出し、ライブラリインスタンスを生成し、プログラムプロセスのメモリ空間にロードする。ライブラリロード部101は、毎回異なるライブラリファイルを用いてライブラリインスタンスを生成する。S104:ロード制御部は、ロードされたライブラリに含まれる、外部からアクセス可能なシンボル、すなわち公開されているシンボルのアドレスを、ライブラリロード部101に問合せる。ここで、シンボルとは、ライブラリに含まれる関数及び変数等のことである。ライブラリロード部101は、上記シンボルのアドレスをロード制御部に返答する。ロード制御部は、割当処理部102に対して、特定のスレッド識別子で識別されるスレッドと、上記手順で得られたアドレスとを通知する。割当処理部102は、上記スレッドと上記アドレスをと対応付けて保持する。この対応付けは、公開されているすべてのシンボルに対して行われる。対応付けが終了したなら、ロード制御部は、スレッド生成部に対して、ライブラリのロードが完了したことを通知する。S105:スレッド生成部は、マルチスレッドプログラムにより指示された数のスレッドを生成する。スレッドがライブラリを呼び出す際の処理S106乃至S107は、第1の実施の形態と全く同様に行うことができるため、説明を省略する。本実施の形態においては、ライブラリロード部101が、複製されたライブラリファイルを利用して、同一のライブラリをメモリ空間上の複数の領域にロードするため、同一のライブラリファイルを複数ロードする機能を備えていない場合であっても、データ競合を起こすことなく、スレッドセーフでないライブラリを利用することができる。<実施の形態3>つぎに、図14を用いて、本発明の実施の形態3にかかる情報処理装置100の構成について説明する。本実施の形態の情報処理装置100も、上述の実施の形態1と同様に、ライブラリロード部101と割当処理部102とを有する。なお、ライブラリロード部101及びライブラリファイルは、実施の形態2と同様の構成であってもよい。本実施の形態の割当処理部102は、アドレス構造体の代わりに、アドレス表とラッパー関数とを利用することを特徴とする。図15に、本実施の形態におけるアドレス表の例を示す。本実施の形態でも、実施の形態1と同様に、ライブラリは関数func0及びfunc1を外部に公開している。また、プログラムはスレッド0及び1を利用する。図15のアドレス表は、これらのスレッドそれぞれに対して、関数func0及びfunc1のアドレスを格納している。図16に、本実施の形態におけるロード制御部の例を示す。本実施の形態におけるロード制御部は、実施の形態1と同様に、dlmopenを利用してライブラリをロードした後に、dlsymを用いてライブラリ関数のアドレスを解決する。ここで、ロード制御部が、解決したアドレスをアドレス表に記録することが本実施例の特徴である。これにより、各スレッド用のライブラリインスタンス内の関数のアドレスがアドレス表に記録される。図17に、本実施の形態におけるラッパー関数の例を示す。ラッパー関数とは、ライブラリ関数と同様のインターフェース関数名と引数を持った関数であって、スレッドからライブラリ関数の代わりに呼び出される関数である。ラッパー関数は、呼び出されるとまず呼び出したスレッドの識別子を取得し、次にアドレス表を検索して、スレッド識別子に対応するアドレスの関数を実行する。これにより、スレッドは、ラッパー関数を呼び出すことによって、スレッド毎に異なるライブラリインスタンス内の関数を呼び出すことができる。図18に、本実施の形態におけるスレッド生成部の例を示す。本実施の形態におけるスレッド生成部は、1つのスレッドを生成するcreate_thread関数と、それを2回呼び出すことによって2つのスレッドを生成するcreate_threads関数とを含む。create_thread関数は、ロード制御部を呼び出してライブラリをロードした後に、thread_create関数を呼び出してスレッドを生成する。なお、thread_create関数とは、通常スレッドライブラリによって提供される関数である。これにより、スレッド生成部は、スレッド生成のたびに、そのスレッド専用のライブラリをロードすることができる。図19に、本実施例のスレッドが実行する関数の例を示す。2つのスレッドは、それぞれライブラリ関数func0又はfunc1を呼び出す。ただし、本実施例では、実施の形態1のように直接ライブラリ関数を呼び出すのではなく、ラッパー関数を経由してライブラリ関数を呼び出す。これにより、各スレッドはそれぞれ異なるライブラリインスタンス内のライブラリ関数を呼び出すこととなり、データ競合の発生を防止することができる。本実施の形態においては、割当処理部102として、ライブラリ関数のインターフェースは同一のラッパー関数を用いるため、スレッドは、直接ライブラリ関数を呼び出す場合とほぼ同様の手順でライブラリ関数を利用することができる。これにより、例えばシングルスレッド用のプログラムをマルチスレッド用に変更する場合などに、プログラムの修正量を少なくすることができる。<その他の実施の形態>なお、本発明は上述した実施の形態のみに限定されるものではなく、本発明の要旨を逸脱しない範囲において種々の変更が可能であることは勿論である。例えば、上述の実施の形態では、主にライブラリを動的にリンクする場合を例として本発明を説明したが、本発明はライブラリを静的にリンクスタティックリンクする場合にも適用できる。スタティックリンクとは、プログラムのコンパイル時にライブラリをリンクする方式である。一例として、図20に本発明をスタティックリンクに適用した場合の情報処理装置200の構成例を示す。スタティックリンク方式においては、コンパイラから呼び出される静的リンカがリンクを行う。情報処理装置200の形態の静的リンカは、一般的な静的リンカの機能に加えて、一つのライブラリファイルを複数回プログラムにリンクする、すなわち複数のライブラリインスタンスをプログラムに静的リンクするという機能を有する。このとき、ライブラリインスタンスの数は、プログラムが利用するスレッド数と等しいことが望ましい。また、静的リンカは、スレッド毎に異なるライブラリインスタンスを呼び出すように、アドレス制御部に対して、各ライブラリインスタンス内のシンボルのアドレスを通知する機能を有することが望ましい。また、上述の実施の形態では、ハードウェアの構成として説明したが、これに限定されるものではなく、任意の処理を、CPUCentralProcessingUnitにコンピュータプログラムを実行させることにより実現することも可能である。この場合、コンピュータプログラムは、様々なタイプの非一時的なコンピュータ可読媒体non-transitorycomputerreadablemediumを用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体tangiblestoragemediumを含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ、光磁気記録媒体例えば光磁気ディスク、CD-ROMReadOnlyMemory、CD-R、CD-R/W、半導体メモリ例えば、マスクROM、PROMProgrammableROM、EPROMErasablePROM、フラッシュROM、RAMrandomaccessmemoryを含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体transitorycomputerreadablemediumによってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。上記実施の形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。付記1マルチスレッドプログラムの複数のスレッドに、データ競合を発生させずに同一のライブラリを利用させる情報処理装置であって、前記ライブラリより複数のインスタンスを生成し、前記複数のインスタンスをメモリ空間にロードするライブラリロード部と、前記ライブラリロード部が生成した前記複数のインスタンスを、前記複数のスレッドに割当てる割当処理部とを含む情報処理装置。付記2前記ライブラリロード部は、同一の前記ライブラリから、毎度異なるインスタンスを生成する処理を行うことにより、前記新たなインスタンスを生成する付記1記載の情報処理装置。付記3前記ライブラリロード部は、前記ライブラリと同一内容の複製ライブラリであって、毎度異なる前記複製ライブラリからインスタンスを生成する処理を行うことにより、前記新たなインスタンスを生成する付記1記載の情報処理装置。付記4前記割当処理部は、前記スレッドの識別子と、前記インスタンスに含まれるシンボル又は変数のうち少なくともいずれか一方のアドレスとを対応付けて保持することにより、前記割当てを行う付記1乃至3いずれか1項記載の情報処理装置。付記5前記割当処理部は、前記アドレスを格納した構造体であって、前記スレッドそれぞれに対して生成されるものであり、前記スレッドは、前記構造体を参照することにより前記アドレスを取得する付記4記載の情報処理装置。付記6前記割当処理部は、アドレス表及びラッパー関数を含み、前記アドレス表は、前記スレッドの識別子と前記アドレスとを対応付けて記録しており、前記ラッパー関数は、指定された前記スレッドの識別子に対応する前記アドレスを取得するものであり、前記スレッドは、前記ラッパー関数を実行することにより前記アドレスを取得する付記4記載の情報処理装置。付記7マルチスレッドプログラムの複数のスレッドに、データ競合を発生させずに同一のライブラリを利用させる情報処理方法であって、前記ライブラリより複数のインスタンスを生成し、前記複数のインスタンスをメモリ空間にロードするロード処理と、前記複数のインスタンスを、前記複数のスレッドに割当てる割当処理とを含む情報処理方法。付記8前記ロード処理は、同一の前記ライブラリから、毎度異なるインスタンスを生成する処理を行うことにより、前記新たなインスタンスを生成するものである付記7記載の情報処理方法。付記9前記ロード処理は、前記ライブラリと同一内容の複製ライブラリであって、毎度異なる前記複製ライブラリからインスタンスを生成する処理を行うことにより、前記新たなインスタンスを生成するものである付記7記載の情報処理方法。付記10前記割当処理は、前記スレッドの識別子と、前記インスタンスに含まれるシンボル又は変数のうち少なくともいずれか一方のアドレスとを対応付けて保持することにより、前記割当てを行うものである付記7乃至9いずれか1項記載の情報処理方法。付記11前記割当処理は、前記スレッドそれぞれに対して生成される構造体に前記アドレスを格納することにより行うものであり、前記スレッドは、前記構造体を参照することにより前記アドレスを取得する付記10記載の情報処理方法。付記12前記割当処理は、アドレス表に前記スレッドの識別子と前記アドレスとを対応付けて記録することにより行うものであり、前記スレッドは、前記スレッドの識別子に基づいて前記アドレスを取得するラッパー関数により前記アドレスを取得する付記10記載の情報処理方法。