相关文章推荐
要出家的煎饼果子  ·  CREATE INDEX ...·  2 月前    · 
紧张的烤面包  ·  Open ...·  1 年前    · 
注册/登录

浅谈Lua对多线程支持初步体验

移动开发 iOS
Lua对多线程支持初步体验是本文要介绍的内容,主要是来了解LUA中多线程的使用,,经过反复的实验得到的结果是,lua不支持多线程,如何让它支持?来看本文内容。

Lua 多线程 支持初步体验是本文要介绍的内容,主要是来了解 LUA 多线程 的使用,经过反复的实验得到的结果是, lua 不支持 多线程 ,安全测试是用的luaInterface.dll接口.目前还没有测试到底是这个dll接口不支持,还是 lua .dll不支持.目前只能用资源池的方式,来解决这个问题,效率上感觉一般.

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Threading;  
  5. namespace Lanlong.Common  
  6. {  
  7.     /// <summary> 
  8.     /// 线程安全对象池  
  9.     /// </summary> 
  10.     /// <typeparam name="T"></typeparam> 
  11.     public class CommonPool<T> 
  12.     {  
  13.         /// <summary> 
  14.         /// 池队列,按照先进后出的方式获得对象  
  15.         /// </summary> 
  16.         private Queue<T> FCache = new Queue<T>();  
  17.         /// <summary> 
  18.         /// 获得池中一个对象的锁  
  19.         /// </summary> 
  20.         private static Object FLockGetObject = new Object();  
  21.         /// <summary> 
  22.         /// 设置初始化池对象,对于一些创建很耗时间的对象,事先创建比较合适  
  23.         /// </summary> 
  24.         /// <param name="aInitObjectArray"></param> 
  25.         public void SetInitObject(T[] aInitObjectArray)  
  26.         {  
  27.             for (int i = 0; i < aInitObjectArray.Length; i++)  
  28.             {  
  29.                 FCache.Enqueue(aInitObjectArray[i]);  
  30.             }  
  31.         }  
  32.           
  33.         /// <summary> 
  34.         /// 从池中获得一个对象  
  35.         /// </summary> 
  36.         /// <returns></returns> 
  37.         public T GetObject()  
  38.         {  
  39.             T result = default(T);  
  40.             // 获取对象锁,防止多个线程同时从池中获取对象  
  41.             lock (FLockGetObject)  
  42.             {  
  43.                 // 等待队列中有可获得的对象  
  44.                 if (FCache.Count <= 0)  
  45.                 {  
  46.                     // 睡眠一段时间,根据实际情况更改睡眠时间,睡眠过短会大量占用cpu资源,此处设置1是为了测试  
  47.                     //Thread.Sleep(50);  
  48.                     // 返回一个空对象,减少系统等待,提高性能  
  49.                     return default(T);  
  50.                 }  
  51.                 //锁定操作队列动作,防止在出列时其它线程会进行入列操作  
  52.                 lock (FCache)  
  53.                 {  
  54.                     try  
  55.                     {  
  56.                         result = FCache.Dequeue();  
  57.                     }  
  58.                     catch  
  59.                     {  
  60.                         Console.WriteLine("资源池队列取出出现异常.");  
  61.                         GameEventLog.ThreadEroor("资源池队列取出出现异常.");  
  62.                     }  
  63.                 }  
  64.             }  
  65.             return result;  
  66.         }  
  67.         /// <summary> 
  68.         /// 返还资源到资源池  
  69.         /// </summary> 
  70.         /// <param name="aObject"></param> 
  71.         public void Return(T aObject)  
  72.         {  
  73.             //锁定操作队列动作,防止在入列时其它线程会进行入列或者出列操作  
  74.             lock (FCache)  
  75.             {  
  76.                 try  
  77.                 {  
  78.                     FCache.Enqueue(aObject);  
  79.                 }  
  80.                 catch  
  81.                 {  
  82.                     Console.WriteLine("资源池队列压栈出现异常");  
  83.                     GameEventLog.ThreadEroor("资源池队列压栈出现异常");  
  84.                 }  
  85.             }  
  86.         }  
  87.         public int Count()  
  88.         {  
  89.             return FCache.Count;  
  90.         }  
  91.     }  

用法如下:

  1. using System;  
  2. using System.Data;  
  3. using System.Data.Common;  
  4. using System.Collections.Generic;  
  5. using System.Text;  
  6. namespace Lanlong.Game.Task  
  7. {  
  8.     public class task  
  9.     {  
  10.         public static CommonPool<TaskMoudle> LuaPool = new CommonPool<TaskMoudle>();  
  11.         public static void setLuaPool()  
  12.         {  
  13.             if (LuaPool.Count() > 0) return;  
  14.             // 为连接池初始化池中对象列表  
  15.             TaskMoudle[] array = new TaskMoudle[20];  
  16.             for (int i = 0; i < array.Length; i++)  
  17.             {  
  18.                 array[i] = new TaskMoudle();  
  19.             }  
  20.             LuaPool.SetInitObject(array);  
  21.         }  
  22.     }  

小结:浅谈 Lua 多线程 支持初步体验的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 互联网
点赞
收藏