> では、スレッド間で複数のデータを渡す場合の方法が無いのではないだろうかと思われ
>るでしょう。これには、変数集合体のパック、アンパック機能を提供し、複数の情報を
>パックして他スレッドに渡すことで、スレッドセーフを保障しています。
いまさらなのかも知れませんが、スレッド間のデータの受け渡しがこれぐらい疎結合で
よいのなら、ひとつのVMで複数のスレッドを動かすのではなく、VMごと分けてしまって、
それぞれ別のスレッドで動かせばよいのではないでしょうか。
このスレッドでは、まさにそういうことを話していたつもりでした。
http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs&from=1221&range=1
>この要求に対しポインターや参照を操作することは、スレッドセーフを著しく
>阻害する要因です。
>なぜなら、2つのスレッドで同じ参照を持った場合、そのデータアクセスに対し
>スレッドセーフを自動で行うことはとても大変であり重い処理となります。
少なくともDiksamの設計なら、ヒープもグローバル変数もDVMの配下にあります。
よって、DVMを複数生成すれば、ふたつのスレッドで同じオブジェクトへの参照を
持つことはありませんし、グローバル変数も別です。
その上で、VM共有変数とかを導入して、VM間のデータのやり取りを考えれば
よいのではないかと。
スクリプト言語において、ひとつのVMで複数のネイティブスレッドを使うことに関しては、
Rubyのまつもとゆきひろさんが以前こんなことを書いています。
http://www.rubyist.net/~matz/20070530.html
>global interpreter lockを使っているので、native threadを使ってもさほど
>並列性はあがらず性能もあがりません。
>というのも、オブジェクトアクセスひとつひとつを排他制御しなければならないので、
>コンフリクトは無視して問題が起きそうなら自分で対処というようなC++のような
>対応はスクリプト言語では難しいでしょう。
(中略)
>また、PythonのGuido van Rossumはスクリプト言語の並列性について
>
http://mail.python.org/pipermail/python-3000/2007-May/007414.html
>という(むしろforkを活用すべきという)意見を述べています。
まあ、JVMなんかでも、doubleの操作はアトミックであることを保証してはいないので、
割り切ってしまう、という考え方もあるかもしれませんけれど。
# ポインタが不正になってクラッシュするのはさすがにまずいのかなあ。
# でも、黙って間違った答を吐くアプリケーションはもっとひどいと思うけど。