0

TCL でマルチスレッドを使用しています。スレッド拡張を使用してスレッドを作成しています。次に、いくつかのコマンドをスレッドに送信します。また、さまざまなファイルでユーザー定義のプロシージャを使用しています。私の質問: 引数として渡したり、スレッド共有変数を使用したりせずに、メイン スレッドのグローバル変数を子スレッドで使用できるようにするにはどうすればよいですか?

それらの変数がいくつあるか分からないので、それらをすべてインポートしたいと思います

環境共有を調べてみましたが、取得した唯一の参照は、環境変数が既に共有されていることです。子スレッドがシステム全体を利用できるようにする必要があります。

ライブラリに関しては、簡単に入手できます。

サンプルコード

global var1

thread::create {
source <library files >(has dummyProc definition)
<execute some statements>
}

thread::send "dummyProc arg1 arg2...argN" result

私の問題:dummyProcはメインスレッドで利用可能な変数(var1など)を使用しますが、TSVを使用したり、引数として渡したりすることはありません。これらのグローバル変数のセット全体が存在するためです。

4

1 に答える 1

1

Tcl のスレッド サポート コードは、これを行わないという原則に基づいて設計されています。それは非常に深い仮定です。各スレッドには独自のインタープリターがあります。唯一の共有状態は、tsvサブパッケージを介して明示的に作成するものです (これは 8.6 のドキュメント ツリーの一部ですが、以前のバージョンでも大きな違いはありません)。スレッドを実装する最も簡単な方法は、その定義コードを (通常の!).tclスクリプト ファイルに配置sourceし、スレッドの作成時に指示を渡すだけで、構成に必要な追加情報があればそれと一緒に渡すことです。特定のタスクを実行する特定のスレッドにします。

これのプラス面?Tcl の実装には、同等の言語よりもはるかに少ない大きなグローバル ロックがあります。(これはもともと、ほぼ純粋な Tcl でプロダクション グレードの商用 Web サーバーを作成していた一部の人々によって提供されました。)


とはいえ、本当にインタープリターを複製したいのであれば、少なくともその一部を実行するのはそれほど難しくありません。パッケージは他のインタープリターにロードできます。名前空間は通常、非常に簡単に複製::ooできます (さまざまな複雑な理由で子になっているものを除いて)。手順は簡単にコピーできます ( info bodyinfo argsおよびinfo defaultはそのために必要なツールです)。 /namespace 変数 (特に、トレースや変数の同期を気にしない場合)。

他のことはもっとトリッキーです。チャンネルを開きますか?クローン作成は非常に難しく、多くの場合不可能です。TclOO のようなもののオブジェクト グラフ? まあ、チャンネルよりも簡単です!Tkウィジェット?しようとしないでください。他の言語での多くの経験は、マルチスレッド GUI が実際には頭を悩ませていることを示しています。

于 2013-05-11T01:05:36.707 に答える