小编lam*_*bda的帖子

Lamport的Paxos中的矛盾使得简单的纸张

阶段2.(a)如果提议者从大多数接受者收到对其准备请求(编号为n)的响应,则它向每个接受者发送一个接受请求,用于编号为n且值为v的提议,其中v为响应中编号最高的提案的值,如果响应未报告任何提议,则为任何值.

如论文中所述,

提议者通过向一组接受者发送提议被接受的请求来发布提议.(这不一定是响应初始请求的同一组接受器.)"

但正如我的理解,如果我们将第2阶段改为:(a):

如果提议者从大多数接受者收到对其准备请求(编号为n)的响应,则它向任意一组多数接受者发送一个接受请求,请求用于编号为n且值为v的提议,其中v是该值的值.答复中编号最高的提案,如果答复未报告提案,则为任何值.

算法将失败,以下是一个例子.考虑到共有3个接受者ABC.我们将使用X(n:v,m)来表示接受者X的状态:提议n:v是X接受的最大编号提议,其中n是提议编号,v是提议的值,m是X曾经回复的编号最大的准备请求的编号.

  1. P1向AB发送'准备1'
  2. AB都承诺不接受任何编号小于1的请求.现在状态为:A( - : - ,1)B( - : - ,1)C( - : - , - )
  3. P1接收响应,然后卡住并且运行得非常慢
  4. P2向AB发送'准备100'
  5. AB都承诺不接受任何编号小于100的请求.现在状态为:A( - : - ,100)B( - : - ,100)C( - : - , - )
  6. P2接收响应,选择值b并将"接受100:b"发送到BC
  7. BC接收并接受接受请求,状态为:A( - : - ,100)B(100:b,100)C(100:b, - ).请注意,已选择提案100:b.
  8. P1恢复,选择值a并向BC发送'accept 1:a'
  9. B不接受它,但C接受它,因为C从未承诺任何东西.状态是:A( - : - ,100)B(100:b,100)C(1:a, - ).选择的提案被放弃,Paxos失败了.

我在这里错过了吗?谢谢.

algorithm distributed distributed-system consensus paxos

14
推荐指数
2
解决办法
744
查看次数

为什么std :: bind可以分配给参数不匹配的std :: function?

我的代码如下:

#include <functional>
#include <iostream>
using namespace std;
void F(int x) {
  cout << x << endl;
}
int main() {
  std::function<void(int)> f1 = std::bind(F, std::placeholders::_1);
  f1(100);  // This works, will print 100.

  int x = 0;
  std::function<void()> f2 = std::bind(F, x);
  f2();  // This works, will print 0.

  std::function<void(int)> f3 = std::bind(F, x);
  f3(200);  // BUT WHY THIS WORKS?????? It prints 0.
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的编译器信息是:Apple LLVM版本6.0(clang-600.0.56)(基于LLVM 3.5svn)目标:x86_64-apple-darwin13.4.0线程模型:posix

c++ bind function std c++11

13
推荐指数
1
解决办法
2349
查看次数