การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่
ใช้ Boost.Asio เพื่อทำงาน IO แบบอะซิงโครนัสที่ทันสมัยและพกพาได้
การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
Boost.Asio
Boost.Asio เป็นไลบรารี C++ สำหรับ I/O แบบอะซิงโครนัสที่เป็นมาตรฐานโดยพฤตินัย รองรับหลายแพลตฟอร์ม มีลักษณะเกือบเป็นไลบรารีที่มีเฉพาะส่วนหัว และมีบริการจำนวนมากใช้งานจริง
io_context
Asio มี boost::asio::io_context เป็นศูนย์กลาง ซึ่งก็คือลูปเหตุการณ์ การดำเนินการแบบอะซิงโครนัสทั้งหมดจะทำงานบนสิ่งนี้
#include <boost/asio.hpp>
namespace asio = boost::asio;
asio::io_context io;
// register async operations...
io.run();ตัวรับการเชื่อมต่อและซ็อกเก็ต
ip::tcp::acceptor รอรับการเชื่อมต่อขาเข้า ส่วน ip::tcp::socket จัดการการเชื่อมต่อแต่ละรายการ
asio::ip::tcp::acceptor acceptor(io,
{asio::ip::tcp::v4(), 8080});
asio::ip::tcp::socket socket(io);
acceptor.async_accept(socket, [&](auto err) {
if (!err) handle(std::move(socket));
});รูปแบบการเรียกกลับ
การดำเนินการแบบอะซิงโครนัสรับตัวจัดการการเสร็จสิ้น ซึ่งโดยทั่วไปเป็นแลมบ์ดา ตัวจัดการจะทำงานบนเธรดของ io_context เมื่อการดำเนินการเสร็จสิ้น
asio::async_read(socket, asio::buffer(buf),
[](auto err, size_t n) {
if (!err) std::cout << "read " << n << " bytes";
});รูปแบบโครูทีน (C++20)
Asio สมัยใหม่รองรับโครูทีน C++20 ซึ่งอ่านได้เหมือนโค้ดแบบพร้อมกัน แต่ทำงานแบบอะซิงโครนัส
asio::awaitable<void> handle(asio::ip::tcp::socket sock) {
char buf[1024];
auto n = co_await sock.async_read_some(asio::buffer(buf), asio::use_awaitable);
co_await asio::async_write(sock, asio::buffer(buf, n), asio::use_awaitable);
}Strand เพื่อความปลอดภัยของเธรด
ให้เรียกใช้ io_context หลายเธรด แต่ใช้ strand เพื่อจัดลำดับตัวจัดการที่เข้าถึงข้อมูลเดียวกันให้ทำงานทีละรายการ ซึ่งทำให้ปลอดภัยโดยไม่ต้องใช้ล็อก
ตัวจับเวลา
Asio มีตัวจับเวลาที่ผสานอยู่ใน io_context ให้กำหนดเวลาการทำงานให้เริ่มหลังจากหน่วงเวลา
asio::steady_timer timer(io, std::chrono::seconds(5));
timer.async_wait([](auto err) {
std::cout << "5 seconds passed";
});บัฟเฟอร์
asio::buffer ใช้ห่อหุ้มหน่วยความจำสำหรับ I/O และทำงานร่วมกับเวกเตอร์ อาร์เรย์ และสตริงได้
std::vector<char> data(1024);
async_read(sock, asio::buffer(data), handler);การจัดการข้อผิดพลาด
ตัวจัดการแบบอะซิงโครนัสจะได้รับ error_code ให้ใช้สิ่งนี้แทนข้อยกเว้นสำหรับความล้มเหลวที่คาดไว้ เช่น การตัดการเชื่อมต่อและการหมดเวลา
Asio แบบอิสระ
Asio มีให้ใช้เป็นไลบรารีแบบอิสระโดยไม่ต้องพึ่งพา Boost ซึ่งเหมาะสำหรับโครงการที่ต้องการหลีกเลี่ยง Boost
ประสิทธิภาพ
Asio เป็นหนึ่งในไลบรารี C++ แบบอะซิงโครนัสที่เร็วที่สุด รองรับการเชื่อมต่อพร้อมกันจำนวนมากในเธรดเดียว และรองรับ io_context แบบหลายเธรด
ควรใช้เมื่อใด
ให้ใช้ Asio สำหรับ:
- เซิร์ฟเวอร์เครือข่ายประสิทธิภาพสูง
- I/O แบบอะซิงโครนัสข้ามแพลตฟอร์ม
- โค้ดแบบอะซิงโครนัสที่ใช้โครูทีน
- ทุกกรณีที่ต้องรองรับการเชื่อมต่อหลายหมื่นรายการ
ตรวจสอบอย่างรวดเร็ว
ออบเจ็กต์ศูนย์กลางใน Boost.Asio ที่ขับเคลื่อนการประมวลผลเหตุการณ์คืออะไร
สรุปทบทวน
Boost.Asio ให้บริการ I/O แบบอะซิงโครนัสข้ามแพลตฟอร์ม io_context เป็นตัวขับเคลื่อนลูปเหตุการณ์ ใช้การเรียกกลับสำหรับรูปแบบดั้งเดิม หรือใช้โครูทีนสำหรับโค้ดแบบอะซิงโครนัสที่ดูเหมือนทำงานพร้อมกัน Asio แบบอิสระทำงานได้โดยไม่ต้องใช้ Boost
คำถามที่พบบ่อย
บทเรียน “การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่”
ใช้ Boost.Asio เพื่อทำงาน IO แบบอะซิงโครนัสที่ทันสมัยและพกพาได้ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- API ซ็อกเก็ต BSD ใน C++
- การสร้างเซิร์ฟเวอร์สะท้อน TCP
- IO แบบอะซิงโครนัสด้วย epoll และ kqueue
- การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่