通过消息传递同步操作

通信顺序进程(CSP)
是一种形式语言,用来描述并发性系统间进行交互的模式
每个线程或进程独立运行,它们之间仅通过消息传递进行通信,而不是直接共享状态
每个线程实际上都是一个状态机:当它接收到一条消息时,会以某种方式更新自己的状态,并且可能会向其他线程发送消息

一个简化的ATM机为例,将代码分成三个独立的线程:
负责操作物理机器
负责处理ATM逻辑
用于与银行通信

一个简单的ATM逻辑状态机:
用一个类来实现它,每个状态都有一个成员函数来表示。然后,每个成员函数可以等待特定的消息,并在它们到达时处理它们,可能触发切换到另一个状态。每一种不同的消息类型由一个独立的结构体表示

struct card_inserted {std::string account; };class atm {
    messaging::receiver incoming;
    messaging::sender bank;
    messaging::sender interface_hardware;
    void (atm::*state)(); // state是指针,指向atm类的一个成员函数(返回类型为void,无参数)
    std::string account;
    std::string pin;    void waiting_for_card() {
        interface_hardware.send(display_enter_card());
        incoming.wait().handle<card_inserted>([&](card_inserted const& msg) {
            account = msg.account; pin = ""; interface_hardware.send(display_enter_pin());
            state = &atm::getting_pin;
        });
    }    void getting_pin();
public:
    void run() { 	// 启动,初始状态为等待插卡
        state = &atm::waiting_for_card; 
        try {for (;;) { (this->*state)(); }} 
        catch (messaging::close_queue const&) { }
    }
};
void atm::getting_pin() {
    incoming.wait()
	.handle<digit_pressed>([&](digit_pressed const& msg) {
        unsigned const pin_length = 4;
        pin += msg.digit;
        if(pin.length() == pin_length) {
            	bank.send(verify_pin(account, pin, incoming));
            	state = &atm::verifying_pin;
        }
    	})
    	.handle<clear_last_pressed>([&](clear_last_pressed const&) {
        if(!pin.empty()) {
            	pin.resize(pin.length() - 1);
        }
    	})
    	.handle<cancel_pressed>([&](cancel_pressed const&) {
        	state = &atm::done_processing;
    	});
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值