2011-12-15 20 views
13

Tôi làm việc trên nhóm ứng dụng dành cho máy tính để bàn bao gồm "nhà phát triển UI" (chúng tôi) và "nhà phát triển C++" (họ). Người phát triển C++ chịu trách nhiệm cho chúng tôi tất cả dữ liệu mà chúng tôi hiển thị trong giao diện người dùng, vì vậy họ thực hiện tất cả IO, truy cập cơ sở dữ liệu, cuộc gọi web, v.v.Giới thiệu về IO không đồng bộ không phải luồng cho C++?

Gần đây, chúng tôi đã gặp phải một số vấn đề nghiêm trọng về hiệu suất với chặn IO chuỗi giao diện người dùng. Tất nhiên, giải pháp cho điều này là làm cho IO không đồng bộ. Nhưng các nhà phát triển C++ nhấn mạnh điều này chỉ có thể bằng cách sinh ra một luồng mới, đó là chúng ta biết rất tốn kém.

Tôi biết từ Node.js, v.v. rằng IO không đồng bộ không cần liên quan đến chuỗi. Tôi biết rằng Win32, và có lẽ là Mac, có một vòng lặp sự kiện. Nhưng, tôi không có ý tưởng những giải pháp nào phổ biến trong đất C++ để thực hiện IO không phải là luồng không đồng bộ. (Có lẽ điều libuv đó nhấn mạnh nút?).

Có ai có thể trỏ đến một số thư viện phổ biến hoặc các bài viết hướng dẫn tốt hơn, vì vậy chúng tôi có thể giới thiệu khái niệm này cho các nhà phát triển C++ của chúng tôi? Điểm thưởng cho nền tảng chéo (PC và Mac). Nhiều điểm thưởng hơn nếu có giải pháp cơ sở dữ liệu không phải là không đồng bộ, vì tôi tin rằng việc sử dụng SQLite của chúng tôi là nguồn gốc của nhiều vấn đề của chúng tôi.

+4

"_tạo một chuỗi mới, như chúng ta biết rất tốn kém_". Tôi thấy ý kiến ​​này rất nhiều. Và tôi phải nói, tôi không biết nó là "rất đắt". Nó phụ thuộc nhiều vào trường hợp sử dụng cụ thể của bạn và các trường hợp mà các chuỗi bổ sung "nên tránh" nhỏ hơn nhiều so với trường hợp chung nên nắm lấy chúng. – Chad

+0

Ứng dụng của chúng tôi yêu cầu đọc các thuộc tính của mọi tệp trong thư viện sách điện tử của người dùng, trong một số trường hợp có thể lên tới 1500 tệp. 1500 chủ đề không được chấp nhận. – Domenic

+4

Tuy nhiên, bạn có thể làm điều đó trong một chủ đề. 1500 mục là một hàng đợi công việc cực kỳ nhỏ. – Chad

Trả lời

11

Boost Asynchronous I/O (asio). Họ có excellent tutorial và một số examples. Nó là nền tảng chéo.

+1

Tôi không thể nói từ việc đọc nó; nó có sử dụng luồng không? – Domenic

+1

Nó không phải. Bạn có thể sử dụng các tin nhắn WM_TIMER và chạy bộ lập lịch tác vụ async bằng cách sử dụng 'boost :: asio :: io_service :: poll_one()'. – Chad

+1

http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/overview/core/threads.html –

Các vấn đề liên quan