有一种A+B的线性高效搞笑抽象简单做法
#include <iostream>
#include <vector>
#include <map>
// Paxos节点角色定义
class Acceptor;
class Proposer;
class Learner;
class Acceptor {
public:
int highest_proposal_seen = -1; // 记录见过的最高提案号
int accepted_value = 0; // 记录被接受的值
bool prepare(int proposal_number) {
// Acceptor接受prepare请求,如果提案号大于当前见过的最大提案号则接受
if (proposal_number > highest_proposal_seen) {
highest_proposal_seen = proposal_number;
return true;
}
return false;
}
bool accept(int proposal_number, int value) {
// 如果提案号大于等于最高提案号,Acceptor接受提案并记住值
if (proposal_number >= highest_proposal_seen) {
highest_proposal_seen = proposal_number;
accepted_value = value;
return true;
}
return false;
}
int get_accepted_value() {
return accepted_value;
}
};
class Proposer {
public:
int proposal_number = 0;
int proposed_value = 0;
void propose(int a, int b, std::vector<Acceptor>& acceptors) {
proposal_number++;
proposed_value = a + b;
// 第一阶段:发送prepare请求
int prepare_count = 0;
for (auto& acceptor : acceptors) {
if (acceptor.prepare(proposal_number)) {
prepare_count++;
}
}
// 如果大多数Acceptor接受了prepare请求,进入第二阶段
if (prepare_count > acceptors.size() / 2) {
int accept_count = 0;
// 第二阶段:发送accept请求
for (auto& acceptor : acceptors) {
if (acceptor.accept(proposal_number, proposed_value)) {
accept_count++;
}
}
/*
如果大多数Acceptor接受了提案,则提案成功
if (accept_count > acceptors.size() / 2) {
std::cout << "Proposer: 提案成功,提议值为: " << proposed_value << std::endl;
} else {
std::cout << "Proposer: 提案失败,未获得足够接受者的同意。" << std::endl;
}
} else {
std::cout << "Proposer: prepare请求失败,未获得足够接受者的同意。" << std::endl;*/
}
}
};
class Learner {
public:
// 学习者从接受者处学习最终的提案值
void learn(std::vector<Acceptor>& acceptors) {
std::map<int, int> value_count;
for (auto& acceptor : acceptors) {
value_count[acceptor.get_accepted_value()]++;
}
// 找到被大多数接受者接受的值
for (auto& awa : value_count) {
int count = awa.second;
int value = awa.first;
if (count > acceptors.size() / 2) {
std::cout /*<< "Learner: 学习到的值为: "*/ << value << std::endl;
return;
}
}
//std::cout << "Learner: 未能学习到一致的值。" << std::endl;
}
};
int main()
{
int a, b;
std::cin >> a >> b; // 输入两个整数
// 创建5个Acceptor(接受者)
std::vector<Acceptor> acceptors(5);
// 创建一个Proposer(提议者)
Proposer proposer;
// Proposer提议两个数的和
proposer.propose(a, b, acceptors);
// 创建一个Learner(学习者)
Learner learner;
// Learner学习最终的和
learner.learn(acceptors);
return 0;
//by chatgpt不是我写的不要封我
}
paxos模拟a+b