Tôi là nhà phát triển C++, người đã chủ yếu được lập trình trên Solaris và Linux cho đến gần đây, khi tôi bị buộc phải tạo một ứng dụng được nhắm mục tiêu đến Windows.Có cách nào để lấy/chèn luồng không khóa trên basic_iostream trong Windows không?
Tôi đã sử dụng thiết kế giao tiếp dựa trên luồng C/I/O được hỗ trợ bởi cổng TCP. Thiết kế dựa trên một luồng đơn đọc liên tục từ luồng (phần lớn thời gian bị chặn trong socket đọc chờ dữ liệu) trong khi các luồng khác gửi qua cùng một luồng (được đồng bộ hóa bởi mutex).
Khi di chuyển đến cửa sổ, tôi đã chọn sử dụng tăng :: asio :: ip :: tcp :: iostream để triển khai luồng socket. Tôi đã mất tinh thần khi thấy rằng thiết kế đa luồng trên dẫn đến bế tắc trên Windows. Có vẻ như operator<<(std::basic_ostream<...>,std::basic_string<...>)
tuyên bố 'Đã gửi' khóa toàn bộ luồng cho cả hoạt động đầu vào và đầu ra. Kể từ khi thread đọc của tôi luôn luôn chờ đợi trên dòng, gửi các hoạt động từ các chủ đề khác bế tắc khi Sentry này được tạo ra.
Dưới đây là phần có liên quan của các cuộc gọi stack trong điều hành < < và Sentry xây dựng:
...
ntdll.dll!7c901046()
CAF.exe!_Mtxlock(_RTL_CRITICAL_SECTION * _Mtx=0x00397ad0) Line 45 C
CAF.exe!std::_Mutex::_Lock() Line 24 + 0xb bytes C++
CAF.exe!std::basic_streambuf<char,std::char_traits<char> >::_Lock() Line 174 C++
CAF.exe!std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...}) Line 78 C++
CAF.exe!std::basic_ostream<char,std::char_traits<char> >::sentry::sentry(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...}) Line 95 + 0x4e bytes C++
> CAF.exe!std::operator<<<char,std::char_traits<char>,std::allocator<char> >(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...}, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Str="###") Line 549 + 0xc bytes C++
...
tôi sẽ là tốt nếu istream và ostream thành phần bị nhốt riêng, nhưng đó không phải là trường hợp.
Có thực hiện thay thế các toán tử luồng mà tôi có thể sử dụng không? Tôi có thể trực tiếp không khóa? Tôi có nên thực hiện của riêng mình (không chắc chắn làm thế nào để làm điều này)?
Mọi đề xuất sẽ được đánh giá cao.
(Nền tảng là Windows 32 và hành vi 64-bit. Quan sát với Visual Studio 2003 Pro và 2008 Express)
+1 Câu hỏi hay, được diễn đạt tốt. Đáng tiếc tôi không có câu trả lời cho bạn! –