Skip to content

Tutorial

木头云 edited this page Oct 18, 2021 · 15 revisions

示例程序:demo

ipc::route

std::vector<char const *> const datas = { "hello!", "foo", "bar", "ISO/IEC", "14882:2011", "ISO/IEC 14882:2017 Information technology - Programming languages - C++", "ISO/IEC 14882:2020", "Modern C++ Design: Generic Programming and Design Patterns Applied" }; // thread producer std::thread t1 {[&] { ipc::route cc { "my-ipc-route" }; // waiting for connection cc.wait_for_recv(1); // sending datas for (auto str : datas) cc.send(str); // quit cc.send(ipc::buff_t('\0')); }}; // thread consumer std::thread t2 {[&] { ipc::route cc { "my-ipc-route", ipc::receiver }; while (1) { auto buf = cc.recv(); auto str = static_cast<char*>(buf.data()); if (str == nullptr || str[0] == '\0') return; std::printf("recv: %s\n", str); } }}; t1.join(); t2.join();

ipc::channel

using namespace std::literals; std::vector<char const*> const datas = { "hello!", "foo", "bar", "ISO/IEC", "14882:2011", "ISO/IEC 14882:2017 Information technology - Programming languages - C++", "ISO/IEC 14882:2020", "Modern C++ Design: Generic Programming and Design Patterns Applied" }; // thread producer std::thread t1{ [&] { ipc::channel cc { "my-ipc-channel", ipc::sender | ipc::receiver }; for (std::size_t i = 0; i < datas.size(); ++i) { // try sending data while (!cc.send(datas[i])) { // waiting for connection cc.wait_for_recv(2); // 这里等待2个连接的原因是,thread producer的cc自身也是一个连接(ipc::receiver) } std::this_thread::sleep_for(1s); // recv ack std::printf("1 recving\n"); auto dd = cc.recv(); auto str = static_cast<char*>(dd.data()); if (str == nullptr) { std::printf("ack: error!\n"); } else { std::printf("ack: %c\n", str[0]); } } // quit cc.send(ipc::buff_t('\0')); } }; // thread consumer std::thread t2{ [&] { ipc::channel cc { "my-ipc-channel", ipc::sender | ipc::receiver }; while (1) { std::printf("2 recving\n"); auto dd = cc.recv(); auto str = static_cast<char*>(dd.data()); if (str == nullptr || str[0] == '\0') return; std::printf("2 recv: %s\n", str); // try sending ack while (!cc.send(ipc::buff_t('a'))) { // waiting for connection cc.wait_for_recv(2); } } } }; t1.join(); t2.join();

自定义功能

// 定义一个多生产多消费的消息队列(暂时不支持大于 large_msg_limit 的数据包,见 issues#46) using msg_queue = chan<relat::multi, relat::multi, trans::unicast /*单播,消费一个就少一个*/>; // 定义一个点对点的通讯管道 using msg_line = chan<relat::single, relat::single, trans::unicast>; /**  * 单播模式下如果因为进程crash导致未及时清理就退出,  * 会引起连接个数的异常(但不会影响新连接,因为单播不会限制receiver个数) */

支持的组合模式(参考 src/ipc.cpp):

template struct chan_impl<ipc::wr<relat::single, relat::single, trans::unicast >>; template struct chan_impl<ipc::wr<relat::single, relat::multi , trans::unicast >>; template struct chan_impl<ipc::wr<relat::multi , relat::multi , trans::unicast >>; template struct chan_impl<ipc::wr<relat::single, relat::multi , trans::broadcast>>; template struct chan_impl<ipc::wr<relat::multi , relat::multi , trans::broadcast>>;

Home
Tutorial

namespaces

classes

head files

Clone this wiki locally