这是正确的FIFO实现吗?

时间:2018-07-21 22:22:34

标签: language-agnostic queue atomic

基本上,我们有两个计数器,一个是添加项目的计数器,另一个是要求保护项目的计数器。尽管它是使用apcu扩展名用PHP编写的,但是inc / add / exists / store / delete关键字应该使任何人都可以理解。 (存储总是设置,仅在键不存在时才添加,inc返回递增的值,如果键不存在则返回FALSE)

function createItem($item) {
  if (!$current = apcu_inc('queue', 1)) {
    // These should never fail.
    if (!apcu_add('queue', 0) || !apcu_add('queue_claim', 0)) {
      return FALSE;
    }
    $current = 0;
  }
  return apcu_add('queue' . $current, $item);
}

function claimItem($item) {
  if (!apcu_exists('queue_claim')) {
    return;
  }
  for ($i = apcu_get('queue_claim'); $i <= apcu_get('queue'); $i++) {
    if (apcu_exists('queue' . $i) && apcu_add('process' . $i, '')) {
      // Every item below either doesn't exist or is being processed.
      apcu_store('queue_claim', $i + 1);
      $item = apcu_get('queue' . $i);
      apcu_delete('queue' . $i);
      apcu_delete('process' . $i);
      return $item;
    }
  }
}

0 个答案:

没有答案