私はDが新しく、実践のためには単純なマルチスレッドサーバーを作成しています。 Cでクライアントハンドラスレッドを開始するための一般的なパラダイムは、新しくaccept()されたソケットのファイル記述子をpthread_create()に渡すことですが、Dのstd.concurrency.spawn()はSocketを渡すことはできません。 2つのスレッドでアクセス可能です。変更可能なスレッドローカルデータへのエイリアスは許可されていません
もちろん、私は実際には不変のソケットを望んでいません(なぜなら、そうしなければ私は本当にメインスレッドでそれをキャストしたくありません) - 私は変更可能なものを渡したいメインスレッドのスコープから外れます。私はこれについてどうやって行くのですか?スレッドにソケットを使用させるには、tid.send(s)
を使用する必要がありますか?なんらかの理由で、それは私には非常に厄介なようです。今
マイコード:
void main() {
Socket listener = new TcpSocket;
...
for (;;) {
Socket s = listener.accept();
scope(exit) s.close();
auto tid = spawn(&clientHandler, s);
}
}
void clientHandler(Socket s) {
...
}
生成します。エラー:静的アサート「変更可能なスレッドローカルデータへのエイリアスが許可されていません。」 ...ここからインスタンス化されました:スポーン!(ソケット)
完璧に作業し、追加情報をありがとう!これは、このようなことをする慣用的な方法ですか、それとももっと良い方法がありますか? Dのキャスティングは、私が間違ったことをしているように(つまりCとは反対に)、まったく同じように感じます。 – Dan
@Dan last最後に私は(共有された) 'shared'のセマンティクスを明確に定義していませんでしたが、それ以後変更されたかどうかはわかりません。 –
何も変更されていません。しかし、Dコミュニティ全体は、「共有」が明確になるのを待っています。 – DejanLekic