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