通信顺序进程(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;});
}