zoukankan      html  css  js  c++  java
  • CAF(C++ actor framework)使用随笔(同步发送 异步与同步等待)(三)

    c). 同步发送, 等待响应, 超时后收到1个系统消息.

    贴上代码

    #include <iostream>
    #include "caf/all.hpp"
    #include "caf/io/all.hpp"
    #include <string>
    #include <thread>
    #include <chrono>
    #include <unistd.h>
    using namespace std;
    using namespace caf;
    
    
    behavior fun(event_based_actor* self){
        return {
            [self](const string& str, const actor &buddy)->string {
                aout(self)<<str<<endl;
                //self->delayed_send(buddy,std::chrono::milliseconds(10),"I'm lated");        
                //std::this_thread::sleep_for(std::chrono::seconds(1));
                //usleep(10000);
                while(1);
                return "log";
                self->quit();
             }
        };
    }
    
    void fun1(event_based_actor* self, const actor &buddy){
        self->sync_send(buddy,"hi!",self).then(
             [=](const string& str) {
                 aout(self)<<str<<endl;
             },
             after(std::chrono::milliseconds(1))>>[&](){
                aout(self)<<"timeout!"<<endl;
             }
        );
        aout(self)<<"i'm not waiting for you!"<<endl;
    }
    
    int main(){
        auto actor1 = spawn(fun);
        auto actor2 = spawn(fun1,actor1);
        caf::await_all_actors_done();
        shutdown();
        return 0;
    }

    其中自己试了几种线程休息的几种方法,发现usleep和 C++11自己提供的线程休眠库会导致coredump并且输出一堆东西,可能是caf自己的东西没有去深究等,

    还有就是delay_send我也一开始有点傻,想用delay_send去回复发过来的消息,所以传入了actor,但是要搞清楚“发送”和“回复”是两种东西,你不能用发送来回复,只能用return来回复

    d). 同步发送, 同步等待. 适用阻塞的actor api.

    #include <iostream>
    #include "caf/all.hpp"
    #include "caf/io/all.hpp"
    #include <string>
    #include <chrono>
    using namespace std;
    using namespace caf;
    
    
    behavior fun(event_based_actor* self){
        return {
            [self](const string& str)->string {
                aout(self)<<str<<endl;
                return "I got it.";
                //self->quit();
             }
        };
    }
    
    void fun1(blocking_actor* self, actor buddy){
        self->sync_send(buddy,"hi!").await(
             [=](const string& str) {
                 aout(self)<<str<<endl;
             },
             after(std::chrono::milliseconds(1))>>[&](){
                aout(self)<<"timeout!"<<endl;
             }
        );
        aout(self)<<"i'm not waiting for you!"<<endl;
    }
    
    int main(){
        auto actor1 = spawn(fun);
        auto actor2 = spawn<blocking_api>(fun1,actor1);
        caf::await_all_actors_done();
        shutdown();
        return 0;
    }

    结果(顺序变了)为

    唯一修改就是spawn那边加上类型。

    自己写了一个很简陋的聊天 传文件的程序,有兴趣可以看一下,维护好友列表,心跳机制都是用caf实现,当时没有用caf的序列话 用的是boost库的。

    https://github.com/zhejiangxiaomai/chat

  • 相关阅读:
    定义serialVersionUID的作用与意义整理
    HttpClient学习整理
    Eclipse+TestNG搭建接口自动化测试框架
    Jmeter之Bean shell使用(一)
    吴军博士的《数学之美》(摘录)
    SqlServer—大话函数依赖与范式
    MySQL—FOREIGN KEY
    MYSQL-用户操作
    WAMPServer 默认安装启动后,图标显示橙黄色
    Linux time命令
  • 原文地址:https://www.cnblogs.com/zhejiangxiaomai/p/5246810.html
Copyright © 2011-2022 走看看