我是D新手,正在寫一個簡單的多線程服務器進行練習。在C中啓動客戶端處理程序線程的一個常見範例是將新接受的套接字的文件描述符傳遞給pthread_create(),但是由於sd.concurrency.spawn()不允許我傳遞Socket,因爲它是可變的並可以通過兩個線程訪問。不允許別名爲可變線程本地數據
當然,我實際上並不想要一個不可變的套接字(這就是爲什麼我不想在主線程中強制轉換它,除非必須) - 我想傳遞一個可變的套接字在主線程中超出範圍。我將如何去做這件事?應該(/可以)我使用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) {
...
}
主要生產:錯誤:靜態斷言「別名可變線程本地數據不準。」 ...從這裏實例化:spawn!(Socket)
完美工作,感謝您的額外信息!這是做這種事的慣用方式,還是有更好的辦法?在D中投射感覺很像我做錯事(即與C相反)。 – Dan
@丹最後我檢查了(一年前)'共享'的語義,其中沒有很好的定義,我不知道自那時起改變 –
沒有什麼改變這一點。但是整個D社區都在等待「共享」,以便明確界定。 – DejanLekic