Tôi mới sử dụng D và tôi đang viết một máy chủ đa luồng đơn giản để thực hành. Một mô hình phổ biến để bắt đầu các chuỗi xử lý máy khách trong C là chuyển qua bộ mô tả tệp của socket mới được chấp nhận() vào pthread_create(), nhưng std.concurrency.spawn() của D sẽ không cho phép tôi truyền Socket vì nó có thể thay đổi được và có thể truy cập bằng hai luồng. Tất nhiên, tôi không thực sự muốn một ổ cắm bất biến (đó là lý do tại sao tôi không thực sự muốn đúc nó trong chủ đề chính trừ khi tôi phải) - Tôi muốn vượt qua một biến thể trong và có nó đi ra khỏi phạm vi trong chủ đề chính. Làm thế nào tôi sẽ đi về điều này? Nên (/ có thể) tôi sử dụng tid.send(s)
để cho các chủ đề sử dụng các ổ cắm? Đối với một số lý do mà có vẻ rất clunky với tôi.Bí danh đối với dữ liệu địa lý có thể thay đổi không được phép
Mã của tôi bây giờ là:
void main() {
Socket listener = new TcpSocket;
...
for (;;) {
Socket s = listener.accept();
scope(exit) s.close();
auto tid = spawn(&clientHandler, s);
}
}
void clientHandler(Socket s) {
...
}
nào sản xuất: Lỗi: tĩnh khẳng định "biệt hiệu để dữ liệu thread-địa phương có thể thay đổi không được phép." ... khởi tạo từ đây: đẻ trứng! (Socket)
Làm việc một cách hoàn hảo và cảm ơn thông tin bổ sung! Đây có phải là cách thành ngữ để làm điều gì đó như thế này hay là có cách nào tốt hơn? Đúc trong D cảm thấy quyết định như tôi đang làm một cái gì đó sai (ví dụ như trái ngược với C). – Dan
@Dan cuối cùng tôi đã kiểm tra (một năm trước) 'chia sẻ' ngữ nghĩa, nơi không được xác định rõ, tôi không biết nếu điều đó thay đổi kể từ đó –
Không có gì thay đổi liên quan đến điều đó. Nhưng toàn bộ cộng đồng D đang chờ đợi 'chia sẻ' để trở nên rõ ràng. – DejanLekic