浅谈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 来源: 互联网
相关推荐

2011-07-08 16:43:46

iPhone Cocoa 多线程

2009-02-10 09:53:41

多线程程序设计Java

2011-08-02 10:26:59

iOS 多线程 线程

2023-10-06 23:06:01

多线程Python

2011-06-13 10:03:19

Qt 多线程 编程

2021-08-12 14:33:20

Python多线程编程

2011-06-07 17:35:39

iphone 多线程

2019-02-26 11:15:25

进程多线程多进程

2011-08-31 16:30:19

Lua多线程

2011-08-29 16:16:22

Lua函数多线程

2009-04-24 09:14:20

.NET多线程锁机制

2009-07-17 10:37:05

C#多线程

2013-12-12 16:30:20

Lua脚本语言

2011-06-24 11:03:31

Qt 多线程 线程

2009-02-12 15:43:38

Windows7体验感想

2010-07-02 13:23:08

2011-08-22 17:41:23

LUA 脚本 语言

2010-04-21 14:29:52

Unix 线程

2020-05-08 08:01:11

多线程Redis处理

2019-06-03 09:13:11

线程进程多线程
点赞
收藏

51CTO技术栈公众号