0Pricing
C++ Academy · บทเรียน

การใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. API ซ็อกเก็ต BSD ใน C++
  2. การสร้างเซิร์ฟเวอร์สะท้อน TCP
  3. IO แบบอะซิงโครนัสด้วย epoll และ kqueue
  4. การใช้ Boost Asio สำหรับ IO แบบอะซิงโครนัสสมัยใหม่
← กลับไปที่ C++ Academy