淺談Lua對多線程支援初步體驗

來源:互聯網
上載者:User

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.                     // 返回一個Null 物件,減少系統等待,提高效能  
  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多線程支援初步體驗的內容介紹完了,希望通過本文的學習能對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.