Ich bin neu in D und ich schreibe einen einfachen Multithread-Server für die Praxis. Ein gängiges Paradigma zum Starten von Client-Handler-Threads in C besteht darin, den Dateideskriptor des neu akzeptierten() ed-Sockets an pthread_create() zu übergeben, aber Ds std.concurrency.spawn() erlaubt es mir nicht, den Socket zu übergeben, weil er veränderbar ist und zugänglich durch zwei Fäden.Aliase zu änderbaren Thread-lokalen Daten nicht erlaubt
Natürlich möchte ich eigentlich keinen unveränderlichen Socket (weshalb ich es nicht wirklich in den Hauptthread werfen möchte, wenn ich nicht muss) - Ich möchte einen veränderlichen einreichen und es haben gehe im Hauptthread aus dem Bereich raus. Wie würde ich darüber gehen? Sollte (/ kann) ich tid.send(s)
verwenden, damit der Thread den Socket benutzt? Aus irgendeinem Grund scheint das sehr klobig zu sein.
Mein Code jetzt:
void main() {
Socket listener = new TcpSocket;
...
for (;;) {
Socket s = listener.accept();
scope(exit) s.close();
auto tid = spawn(&clientHandler, s);
}
}
void clientHandler(Socket s) {
...
}
Welche erzeugt: Fehler: statische assert "Aliases zu wandelbar lokalen Thread-Daten erlaubt es nicht." ... instanziiert von hier: spawn! (Socket)
Arbeitete perfekt, und danke für die zusätzlichen Informationen! Ist das der idiomatische Weg, so etwas zu tun, oder gibt es einen besseren Weg? Casting in D fühlt sich entschieden an, als würde ich etwas falsch machen (dh im Gegensatz zu C). – Dan
@Dan zuletzt habe ich überprüft (vor einem Jahr) 'shared' Semantik, wo nicht gut definiert, ich weiß nicht, ob das seit damals geändert –
Nichts in Bezug auf das geändert. Aber die gesamte D-Community wartet darauf, dass 'shared' klar definiert wird. – DejanLekic