Sono nuovo a D e sto scrivendo un semplice server multithreading per esercitarsi. Un paradigma comune per avviare i thread del gestore client in C è passare il descrittore di file del socket appena accettato() in pthread_create(), ma D's st.c.current.savewn() non mi permetterà di passare il Socket perché è mutabile e accessibile da due thread.Alias di dati locali del thread mutabili non consentiti
Ovviamente, in realtà non voglio un socket immutabile (è per questo che non voglio scriverlo nel thread principale a meno che non sia necessario) - Voglio passare uno mutabile e averlo uscire dal campo di applicazione nella discussione principale. Come andrei su questo? Dovrei (/ posso) usare tid.send(s)
per permettere al thread di usare il socket? Per qualche ragione mi sembra molto schifoso.
Il mio codice ora:
void main() {
Socket listener = new TcpSocket;
...
for (;;) {
Socket s = listener.accept();
scope(exit) s.close();
auto tid = spawn(&clientHandler, s);
}
}
void clientHandler(Socket s) {
...
}
che produce: Errore: statici assert "alias ai dati thread-local mutevoli non consentita". ... istanziato da qui: spawn! (Socket)
Ha funzionato perfettamente, e grazie per le informazioni aggiuntive! È questo il modo idiomatico di fare qualcosa di simile, o c'è un modo migliore? Il casting in D è decisamente come se stessi facendo qualcosa di sbagliato (cioè in opposizione a C). – Dan
@Dan scorso ho controllato (un anno fa) la semantica 'condivisa' dove non ben definita, non so se sia cambiata da allora –
Non è cambiato nulla rispetto a quello. Ma l'intera comunità D sta aspettando che 'shared' diventi ben definito. – DejanLekic