CAF(C++ actor framework)使用随笔(send sync_send)(二)

a). 发完就忘, 就像上面anon_send 以及send

#include <iostream>
#include "caf/all.hpp"
#include "caf/io/all.hpp"
#include <string>
using namespace std;
using namespace caf;


behavior fun(event_based_actor* self){
    return {
        [self](const string& str,actor a) {
            aout(self)<<"get message: "<<str<<endl;
            //get the actor a's address
            aout(self)<<to_string(a.address())<<endl;
            // send message anonymously
            anon_send(a,"hello");
            // get lastest current message
            aout(self)<<"current_message: "<<to_string(self->current_message())<<endl;
            aout(self)<<"current_sender: "<<to_string(self->current_sender())<<endl;
            self->quit();
            return;
         }
        };
}

int main(){
    auto actor1 = spawn(fun);
     {
    scoped_actor self;
    self->send(actor1,"anon_send",self);
    //wrong code  scoped_actor do not have anon_send and become function
    
    // self->become(
    //     [=](const string& str){
    //         aout(self)<<"get message: "<<str<<endl;
    //     );
    }
    caf::await_all_actors_done();
    shutdown();
    return 0;
}

结果图:

发现scoped_actor 不能使用anon_send 和becoem函数,但我个人理解scoped的send就是anon的发送,发完他就消失了。

 

b).同步发送, 等待响应. 等待是异步的, 相当于只是期待1个响应.

贴上代码

#include <iostream>
#include "caf/all.hpp"
#include "caf/io/all.hpp"
#include <string>
using namespace std;
using namespace caf;


behavior fun(event_based_actor* self){
    return {
        [self](const string& str) {
            self->quit();
            return "hello, world"; 
         }
    };
}

void fun1(event_based_actor* self, const actor &buddy){
    self->sync_send(buddy,"hi!").then(
        [=](const string& str) {
        aout(self)<<str<<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;
}

结果为

其实这里遇到两个小问题,第一个就是作为参数传入的actor buddy必须定义为const,不然编译会报错,第二个问题,我自己认为这个代码的结果应该会需要我ctrl+C去结束。结果,我发现actor2在接受到这个消息之后跑完也就调用quit()了,那么我自己就把then()里面的代码注释起来,再编译通过了,运行的时候就coredump了。想到了c++11里面 如果线程不join也会发生coredump。所以还是要注意这个问题,目前还没讲异常处理。

你可能感兴趣的:(CAF(C++ actor framework)使用随笔(send sync_send)(二))