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;
|
||
}
|
||
}
|
||
}
|
||
}
|