Jestem nowym użytkownikiem D i piszę prosty serwer wielowątkowy do ćwiczeń. Wspólnym paradygmatem do uruchamiania wątków obsługi klienta w C jest przekazanie deskryptora pliku gniazda new-accept() ed do pthread_create(), ale D's std.concurrency.spawn() nie pozwoli mi przekazać gniazda, ponieważ jest zmienne i dostępne przez dwa wątki.Aliasy do zmiennych lokalnych danych wątków niedozwolone
Oczywiście nie potrzebuję niezmiennego gniazda (dlatego tak naprawdę nie chcę go przesyłać w głównym wątku, chyba że muszę) - chcę przekazać zmienną i mieć ją wykracza poza zakres w głównym wątku. Jak bym to zrobił? Powinien (/ może) używać tid.send(s)
, aby wątek używał gniazda? Z jakiegoś powodu wydaje mi się to bardzo nieostrożne.
Mój kod teraz:
void main() {
Socket listener = new TcpSocket;
...
for (;;) {
Socket s = listener.accept();
scope(exit) s.close();
auto tid = spawn(&clientHandler, s);
}
}
void clientHandler(Socket s) {
...
}
która produkuje: Błąd: „Aliasy statyczne dochodzić do modyfikowalnych danych gwintów lokalnego niedozwolone.” ... utworzony stąd: spawn! (Socket)
Działa doskonale, a dzięki za dodatkowe informacje! Czy to jest idiomatyczny sposób na zrobienie czegoś takiego, czy jest jakiś lepszy sposób? Casting in D wydaje się zdecydowanie, że robię coś złego (tj. W przeciwieństwie do C). – Dan
@Dan ostatnio sprawdziłem (rok temu) semantyka "shared", gdzie nie jest dobrze zdefiniowana, nie wiem czy to się zmieniło od tego czasu –
Nic się nie zmieniło w związku z tym. Ale cała społeczność D czeka, aż "wspólny" stanie się dobrze zdefiniowany. – DejanLekic