Lua对多线程支持初步体验是本文要介绍的内容,主要是来了解LUA中多线程的使用,经过反复的实验得到的结果是,lua不支持多线程,安全测试是用的luaInterface.dll接口.目前还没有测试到底是这个dll接口不支持,还是lua.dll不支持.目前只能用资源池的方式,来解决这个问题,效率上感觉一般.
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Threading;
- namespace Lanlong.Common
- {
- /// <summary>
- /// 线程安全对象池
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class CommonPool<T>
- {
- /// <summary>
- /// 池队列,按照先进后出的方式获得对象
- /// </summary>
- private Queue<T> FCache = new Queue<T>();
- /// <summary>
- /// 获得池中一个对象的锁
- /// </summary>
- private static Object FLockGetObject = new Object();
- /// <summary>
- /// 设置初始化池对象,对于一些创建很耗时间的对象,事先创建比较合适
- /// </summary>
- /// <param name="aInitObjectArray"></param>
- public void SetInitObject(T[] aInitObjectArray)
- {
- for (int i = 0; i < aInitObjectArray.Length; i++)
- {
- FCache.Enqueue(aInitObjectArray[i]);
- }
- }
- /// <summary>
- /// 从池中获得一个对象
- /// </summary>
- /// <returns></returns>
- public T GetObject()
- {
- T result = default(T);
- // 获取对象锁,防止多个线程同时从池中获取对象
- lock (FLockGetObject)
- {
- // 等待队列中有可获得的对象
- if (FCache.Count <= 0)
- {
- // 睡眠一段时间,根据实际情况更改睡眠时间,睡眠过短会大量占用cpu资源,此处设置1是为了测试
- //Thread.Sleep(50);
- // 返回一个空对象,减少系统等待,提高性能
- return default(T);
- }
- //锁定操作队列动作,防止在出列时其它线程会进行入列操作
- lock (FCache)
- {
- try
- {
- result = FCache.Dequeue();
- }
- catch
- {
- Console.WriteLine("资源池队列取出出现异常.");
- GameEventLog.ThreadEroor("资源池队列取出出现异常.");
- }
- }
- }
- return result;
- }
- /// <summary>
- /// 返还资源到资源池
- /// </summary>
- /// <param name="aObject"></param>
- public void Return(T aObject)
- {
- //锁定操作队列动作,防止在入列时其它线程会进行入列或者出列操作
- lock (FCache)
- {
- try
- {
- FCache.Enqueue(aObject);
- }
- catch
- {
- Console.WriteLine("资源池队列压栈出现异常");
- GameEventLog.ThreadEroor("资源池队列压栈出现异常");
- }
- }
- }
- public int Count()
- {
- return FCache.Count;
- }
- }
- }
用法如下:
- using System;
- using System.Data;
- using System.Data.Common;
- using System.Collections.Generic;
- using System.Text;
- namespace Lanlong.Game.Task
- {
- public class task
- {
- public static CommonPool<TaskMoudle> LuaPool = new CommonPool<TaskMoudle>();
- public static void setLuaPool()
- {
- if (LuaPool.Count() > 0) return;
- // 为连接池初始化池中对象列表
- TaskMoudle[] array = new TaskMoudle[20];
- for (int i = 0; i < array.Length; i++)
- {
- array[i] = new TaskMoudle();
- }
- LuaPool.SetInitObject(array);
- }
- }
- }
小结:浅谈Lua对多线程支持初步体验的内容介绍完了,希望通过本文的学习能对你有所帮助!