1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
	structure pointer_t {ptr: pointer to node_t, count: unsigned integer}
	structure node_t {value: data type, next: pointer_t}
	structure queue_t {Head: pointer_t, Tail: pointer_t}

	initialize(Q: pointer to queue_t)
	node = new_node()		// 创建新的空闲节点
	node->next.ptr = NULL	// 将其变为LinkList的单节点
	Q->Head.ptr = Q->Tail.ptr = node	// 把Head,Trail节点都设置为这个节点

	enqueue(Q: pointer to queue_t, value: data type)
	E1:   node = new_node()	// 创建一个新空闲节点
	E2:   node->value = value	// 拷贝入栈值到空闲节点
	E3:   node->next.ptr = NULL	// 配置当前节点的下一节点为null
	E4:   loop			// 循环不停尝试直到入队结束
	E5:      tail = Q->Tail	// 获取 Tail.ptr 和 Tail.count 
	E6:      next = tail.ptr->next	// 读取next ptr和 count fields
	E7:      if tail == Q->Tail	// tail和next是确定的吗
				// Tail仍然指向最后一个节点吗
	E8:         if next.ptr == NULL
					// 尝试把节点放到队列尾部
	E9:            if CAS(&tail.ptr->next, next, <node, next.count+1>)
	E10:               break	// 入队成功,退出循环
	E11:            endif
	E12:         else		// Tail由于并发没有指向下一个节点
					// 尝试移动Tail到下一个节点
	E13:            CAS(&Q->Tail, tail, <next.ptr, tail.count+1>)
	E14:         endif
	E15:      endif
	E16:   endloop
			// 入队结束.  尝试把Tail节点更新为当前新插入的节点
	E17:   CAS(&Q->Tail, tail, <node, tail.count+1>)

	dequeue(Q: pointer to queue_t, pvalue: pointer to data type): boolean
	D1:   loop			     // 持续尝试直到出队结束
	D2:      head = Q->Head	     // Read Head 读头节点
	D3:      tail = Q->Tail	     // Read Tail 读尾节点
	D4:      next = head.ptr->next    // 读头节点的下一节点
	D5:      if head == Q->Head	     // 头节点和尾节点是否确定?
	D6:         if head.ptr == tail.ptr // 队空或尾部超过头部?
	D7:            if next.ptr == NULL  // 队空?
	D8:               return FALSE      // 队列为空,无法出队
	D9:            endif
					// Tail如果确实落后,尝试更新Tail
	D10:            CAS(&Q->Tail, tail, <next.ptr, tail.count+1>)
	D11:         else		     // No need to deal with Tail
					// 在CAS前读取值不然下一个出队操作可能释放下一个节点
	D12:            *pvalue = next.ptr->value
					// 尝试交换Head节点到下一个节点
	D13:            if CAS(&Q->Head, head, <next.ptr, head.count+1>)
	D14:               break             //出队成功,退出循环
	D15:            endif
	D16:         endif
	D17:      endif
	D18:   endloop
	D19:   free(head.ptr)		     //当前安全,可以释放原节点 
	D20:   return TRUE                   // 队列非空,出队成功