-
Notifications
You must be signed in to change notification settings - Fork 357
Tutorial
木头云 edited this page Oct 18, 2021
·
15 revisions
示例程序:demo
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();
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>>;
namespaces
classes
ipc::buffer
ipc::circ::elem_array
ipc::circ::queue
ipc::route
ipc::channel
ipc::spin_lock
ipc::rw_lock
ipc::shm::handle
ipc::tls::pointer
ipc::mem::pool_alloc
head files