74 lines
1.5 KiB
C#
74 lines
1.5 KiB
C#
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//
|
|||
|
|
// 文件:Assets/Code/Scripts/Framework/Net/Base/Queue.cs
|
|||
|
|
// 作者:Xoen Xie
|
|||
|
|
// 时间:2023/07/18
|
|||
|
|
// 描述:一个简单的无锁队列,同一时刻只允许一个线程读,一个线程写
|
|||
|
|
// 说明:
|
|||
|
|
//
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
using System;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace Framework
|
|||
|
|
{
|
|||
|
|
public sealed class NetQueue<T>
|
|||
|
|
{
|
|||
|
|
class _Node
|
|||
|
|
{
|
|||
|
|
public T data;
|
|||
|
|
public _Node next;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private _Node m_Head;
|
|||
|
|
private _Node m_Tail;
|
|||
|
|
|
|||
|
|
private ulong m_nPushCount;
|
|||
|
|
private ulong m_nPopCount;
|
|||
|
|
|
|||
|
|
public NetQueue()
|
|||
|
|
{
|
|||
|
|
m_Head = new _Node();
|
|||
|
|
m_Head.next = null;
|
|||
|
|
m_Tail = m_Head;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Push(T data)
|
|||
|
|
{
|
|||
|
|
_Node newNode = new _Node();
|
|||
|
|
newNode.data = data;
|
|||
|
|
newNode.next = null;
|
|||
|
|
|
|||
|
|
m_Tail.next = newNode;
|
|||
|
|
m_Tail = newNode;
|
|||
|
|
|
|||
|
|
++m_nPushCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool Pop(out T data)
|
|||
|
|
{
|
|||
|
|
if (m_Head.next != null)
|
|||
|
|
{
|
|||
|
|
++m_nPopCount;
|
|||
|
|
|
|||
|
|
m_Head = m_Head.next;
|
|||
|
|
data = m_Head.data;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
data = default(T);
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public ulong Count
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_nPushCount - m_nPopCount;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|