淺談Lua對多線程支持初步體驗(yàn)
作者:佚名
Lua對多線程支持初步體驗(yàn)是本文要介紹的內(nèi)容,主要是來了解LUA中多線程的使用,,經(jīng)過反復(fù)的實(shí)驗(yàn)得到的結(jié)果是,lua不支持多線程,如何讓它支持?來看本文內(nèi)容。
Lua對多線程支持初步體驗(yàn)是本文要介紹的內(nèi)容,主要是來了解LUA中多線程的使用,經(jīng)過反復(fù)的實(shí)驗(yàn)得到的結(jié)果是,lua不支持多線程,安全測試是用的luaInterface.dll接口.目前還沒有測試到底是這個(gè)dll接口不支持,還是lua.dll不支持.目前只能用資源池的方式,來解決這個(gè)問題,效率上感覺一般.
- 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>
- /// 池隊(duì)列,按照先進(jìn)后出的方式獲得對象
- /// </summary>
- private Queue<T> FCache = new Queue<T>();
- /// <summary>
- /// 獲得池中一個(gè)對象的鎖
- /// </summary>
- private static Object FLockGetObject = new Object();
- /// <summary>
- /// 設(shè)置初始化池對象,對于一些創(chuàng)建很耗時(shí)間的對象,事先創(chuàng)建比較合適
- /// </summary>
- /// <param name="aInitObjectArray"></param>
- public void SetInitObject(T[] aInitObjectArray)
- {
- for (int i = 0; i < aInitObjectArray.Length; i++)
- {
- FCache.Enqueue(aInitObjectArray[i]);
- }
- }
- /// <summary>
- /// 從池中獲得一個(gè)對象
- /// </summary>
- /// <returns></returns>
- public T GetObject()
- {
- T result = default(T);
- // 獲取對象鎖,防止多個(gè)線程同時(shí)從池中獲取對象
- lock (FLockGetObject)
- {
- // 等待隊(duì)列中有可獲得的對象
- if (FCache.Count <= 0)
- {
- // 睡眠一段時(shí)間,根據(jù)實(shí)際情況更改睡眠時(shí)間,睡眠過短會大量占用cpu資源,此處設(shè)置1是為了測試
- //Thread.Sleep(50);
- // 返回一個(gè)空對象,減少系統(tǒng)等待,提高性能
- return default(T);
- }
- //鎖定操作隊(duì)列動作,防止在出列時(shí)其它線程會進(jìn)行入列操作
- lock (FCache)
- {
- try
- {
- result = FCache.Dequeue();
- }
- catch
- {
- Console.WriteLine("資源池隊(duì)列取出出現(xiàn)異常.");
- GameEventLog.ThreadEroor("資源池隊(duì)列取出出現(xiàn)異常.");
- }
- }
- }
- return result;
- }
- /// <summary>
- /// 返還資源到資源池
- /// </summary>
- /// <param name="aObject"></param>
- public void Return(T aObject)
- {
- //鎖定操作隊(duì)列動作,防止在入列時(shí)其它線程會進(jìn)行入列或者出列操作
- lock (FCache)
- {
- try
- {
- FCache.Enqueue(aObject);
- }
- catch
- {
- Console.WriteLine("資源池隊(duì)列壓棧出現(xiàn)異常");
- GameEventLog.ThreadEroor("資源池隊(duì)列壓棧出現(xiàn)異常");
- }
- }
- }
- 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);
- }
- }
- }
小結(jié):淺談Lua對多線程支持初步體驗(yàn)的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!
責(zé)任編輯:zhaolei
來源:
互聯(lián)網(wǎng)