スレッディング
Duktapeは限定的なマルチスレッドをサポートしています。
- duk_create_heap()で作成された特定のDuktapeヒープはシングルスレッドです: 一度にヒープ内でコードを実行できるネイティブ・スレッドは1つだけです。ネイティブ・スレッドは、同じDuktapeヒープで同時に2つのネイティブ・スレッドがアクティブにならない限り、時間の経過とともに変更することができます。
- Duktape/Cコールの中でduk_suspend()を使ってDuktapeの実行を中断し、後で duk_resume()で再開することが可能です。これらの呼び出しの間に、別のスレッドが同じDuktapeヒープを呼び出す可能性があります。アプリケーション・コードは、一度に1つのネイティブ・スレッドしかDuktapeを呼び出さないようにするために、必要なロックを管理しなければなりません。
- Duktapeのヒープは、互いに完全に分離されています。Duktapeヒープごとにアクティブなネイティブ・スレッドが1つだけ存在する限り、複数のネイティブ・スレッドが同時にコードを実行することが可能です。
背景として、Duktapeヒープは、ヒープ内に存在するDuktapeスレッドの数にかかわらず、単一のメモリー管理領域です(ネイティブ・スレッドとDuktapeスレッドを混同しないでください)。ヒープ内のDuktapeスレッドはオブジェクト参照を共有できるため、マルチスレッド対応にはガベージ・コレクションと全てのオブジェクト処理に同期が必要になります。同期化は大きな移植性の問題になるので、実用的なアプローチは、Duktapeヒープをシングルスレッドに制限することです。Duktapeヒープは何も共有しないので、原則的にヒープ間のスレッド制限はありません。しかし、いくつかのプラットフォーム機能が利用できない場合(可変プリプロセッサー・マクロやリエントラント・システムコールなど)には、いくつかの制限があります。
スレッド制限の詳細とベストプラクティスについては、threading.rstとHow to use multiple native threadsを参照してください。