青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

(搬運工)關于mangos多線程處理方式

Posted on 2012-07-23 11:25 點點滴滴 閱讀(1135) 評論(0)  編輯 收藏 引用 所屬分類: 10 服務器
由于目前的MANGOS只是針對個人單機用戶制作的,并非真正的服務器版。使用的是單線程的處理方式。
關于mangos多線程處理方式

聽說配置這個文件是管理線程的,不過不知道有沒有用!
# 在多線程系統 使用線程MASK(只在Windows系統下使用)
# 默認: 0 (操作系統來選擇)
# 舉例: 數字
UseProcessors = 0

目前的mangos上了幾十人后,只要有組隊的組團的就會卡,奇怪CPU占用也不高。請教了大大之后明白原來是mangos自身的瓶頸問題。

CK說:
由于目前的MANGOS只是針對個人單機用戶制作的,并非真正的服務器版。使用的是單線程的處理方式。這個由代碼就可以看出,整個World(包括人物,怪等)都是靠World.cpp里的update函數發起掉用的。而他是使用單線程的方式,從頭遍歷所有的玩家,一個一個按照次序的來進行獲取封包,并處理然后發送。這也就是為什么,當你打開MANGOS這個服務端,竟然CPU占用很少的原因。
在網上,我也看到過有人打算用多開區(EXE)來達到玩家分流,也只是治表不治本的方法。按照MANGOS的框架總體上來說人數達到100其實是一個上限值再上去的話,可能情況就是PING值雖然不高,但還是覺得卡。因為玩家封包沒有及時處理,而停留在“等待處理”中。卡怪,卡魔法這樣的情況很容易產生。特別當有一個PING值非常高的玩家,在SESSION排隊列表里比你靠前時,這種情況最容易發生。

CK給出的代碼:
在World.cpp文件里,做一個線程函數來代替
update函數里的

CODE:

for (SessionMap::iterator itr = m_sessions.begin(), next; itr != m_sessions.end(); itr = next)
{
next = itr;
next++;

if(!itr->second)
continue;

if(!itr->second->Update(diff))
{
delete itr->second;
m_sessions.erase(itr);
}
}
[url=javascript:][Copy to clipboard][/url]

以上代碼就是我剛才說的,從頭遍歷所有玩家并依次調用,所有玩家session的update函數。以下是修正建立自己的線程
CODE:

DWORD World::_UpdateThread(LPVOID lp)
{
ThreadParm *parm = (ThreadParm *)lp;
World *pworld = (World *)parm->world;
HANDLE m_hSingle = NULL;
while (true)
{
SessionMap sessions = pworld->GetSessions();
SessionMap::iterator itr = NULL;
SessionMap::iterator next = NULL;

for (itr = sessions.begin(), next; itr != sessions.end(); itr = next)
{
next = itr;
next++;

if(itr == NULL || !itr->second || itr->second->GetWorking())
continue;

m_hSingle = OpenEvent(EVENT_ALL_ACCESS,true,"worldsession"); //這里必須對所操作資源進行同步處理,否則將會出現線程之間資源訪問的沖突。一個線程處理一個玩家,其他線程直接跳轉到后面的列隊
if (m_hSingle == NULL)
{
m_hSingle = CreateEvent(NULL, FALSE, TRUE, "worldsession");
}
if (WaitForSingleObject(m_hSingle, 10000) == WAIT_TIMEOUT)//我把超時設置為10秒,以防死鎖
{
SetEvent(m_hSingle);
m_hSingle = CreateEvent(NULL, FALSE, TRUE, "worldsession");
}
itr->second->SetWorking(true);
SetEvent(m_hSingle); //記得別忘了把鎖打開,否則這個玩家之后所有的封包操作將被忽略。
if (!itr->second->Update(time(NULL)))
{
pworld->RemoveErrorSession(itr->second->GetAccountId());
}
else
{
itr->second->SetWorking(false);
}
}
Sleep(100); //線程間隔時間我設置為0.1秒
}
return 0;
}
[url=javascript:][Copy to clipboard][/url]

接下來就是如何去開啟線程進行處理了,在world.cpp里有個SetInitialWorldSettings函數,這個是初始化World里面所有數據的總入口。我們可以把線程啟動放那里。
先在mangosd.conf文件里設置一串
CODE:
WorldSessionThread = 3
[url=javascript:][Copy to clipboard][/url]
設置3個啟動線程
接下去就是在SetInitialWorldSettings里修改了
CODE:

....
sLog.outString( "Loading Loot Tables..." );
LoadLootTables();
//在這里添加我們的線程函數
for (int i = 0; i diff = i;
t->world = this;
::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_UpdateThread,(LPVOID)t,0,&tid);
}
[url=javascript:][Copy to clipboard][/url]
GetIntDefault函數第一個我就不解釋了,第二個值是表示默認值,比如你配置文件里沒設置WorldSessionThread = 3這條語句的話,默認就是2個線程

這樣一來,我們的MANGOS服務端在處理能力上,將得到很大的提升


龍苑的林碧給出的提示:
thread.cpp

#include <stdio.h>
#ifdef _WIN32
#include "socket_include.h"
#else
#include <unistd.h>
#endif

#include "Thread.h"

#ifndef __GNUC__

// UQ1: warning C4311: 'type cast' : pointer truncation
#pragma warning(disable:4311)

#endif

Thread::Thread(bool release)
:m_thread(0)
,m_running(true)
,m_release(false)
{
#ifdef _WIN32
m_thread = ::CreateThread(NULL, 0, StartThread, this, 0, &m_dwThreadId);
#else
pthread_attr_t attr;

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
if (pthread_create(&m_thread,&attr,StartThread,this) == -1)
{
perror("Thread: create failed");
SetRunning(false);
}
// pthread_attr_destroy(&attr);
#endif
m_release = release;
}


Thread::~Thread()
{
// while (m_running || m_thread)
if (m_running)
{
SetRunning(false);
SetRelease(true);

#ifdef _WIN32
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
select(0,NULL,NULL,NULL,&tv);
::CloseHandle(m_thread);
#else
sleep(1);
#endif
}
}


threadfunc_t STDPREFIX Thread::StartThread(threadparam_t zz)
{
Thread *pclThread = (Thread *)zz;

while (pclThread -> m_running && !pclThread -> m_release)
{
#ifdef _WIN32
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
select(0,NULL,NULL,NULL,&tv);
#else
sleep(1);
#endif
}
if (pclThread -> m_running)
{
pclThread -> Run();
}
pclThread -> SetRunning(false); // if return
return (threadfunc_t)zz;
}


bool Thread::IsRunning()
{
return m_running;
}


void Thread::SetRunning(bool x)
{
m_running = x;
}


bool Thread::IsReleased()
{
return m_release;
}


void Thread::SetRelease(bool x)
{
m_release = x;
}
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美韩日| 亚洲免费电影在线| 欧美一区激情| 亚洲自拍电影| 亚洲欧美日韩综合aⅴ视频| 亚洲日产国产精品| 欧美激情91| 91久久精品美女高潮| 亚洲欧洲一区二区天堂久久| 日韩小视频在线观看专区| 国产精品99久久久久久久女警| 亚洲网站在线看| 久久精品免费电影| 欧美久久一级| 国产偷国产偷精品高清尤物| 亚洲国产成人不卡| 日韩性生活视频| 久久国产免费| 91久久亚洲| 久久成人18免费网站| 欧美韩日精品| 国产综合久久久久久| 一级成人国产| 麻豆精品精华液| 日韩一本二本av| 久久久久九九视频| 欧美午夜精品久久久| 国产一区二区三区高清在线观看| 亚洲国产欧美一区二区三区久久| 亚洲一级在线观看| 免费一区二区三区| 亚洲综合色丁香婷婷六月图片| 麻豆精品传媒视频| 国产精品国产三级国产aⅴ入口| 影音先锋亚洲视频| 香蕉亚洲视频| 日韩亚洲视频| 欧美精品一二三| 在线电影一区| 久久频这里精品99香蕉| 亚洲天堂成人在线视频| 欧美福利在线观看| 影音先锋在线一区| 久久久久9999亚洲精品| 夜夜嗨av一区二区三区网页| 蜜桃久久av一区| 激情一区二区三区| 欧美亚男人的天堂| 亚洲人成绝费网站色www| 久久精品一区二区三区中文字幕| 日韩视频在线你懂得| 欧美不卡视频一区| 在线看国产日韩| 狂野欧美激情性xxxx欧美| 亚洲欧美日韩在线不卡| 国产精品高潮在线| 亚洲私人影吧| 99视频超级精品| 欧美日本久久| 亚洲精品网站在线播放gif| 久久综合激情| 久久久久国产精品一区| 亚洲成色777777在线观看影院| 久久久91精品国产| 欧美一区二区三区在线视频| 国产欧美婷婷中文| 久久国产精品久久久久久| 亚洲愉拍自拍另类高清精品| 国产精品一区在线播放| 欧美中文字幕在线播放| 久久精品二区三区| 亚洲国产美女久久久久 | 亚洲欧美日韩精品综合在线观看| 日韩视频第一页| 国产精品露脸自拍| 欧美亚洲色图校园春色| 亚洲欧美精品在线| 伊人久久久大香线蕉综合直播| 蜜臀av国产精品久久久久| 欧美成人精品一区二区三区| 亚洲少妇自拍| 午夜在线不卡| 亚洲高清不卡| 亚洲人体大胆视频| 国产精品国产三级国产专播品爱网 | 欧美日韩国产综合久久| 亚洲一区二区免费| 亚洲欧美国内爽妇网| 伊人久久久大香线蕉综合直播| 亚洲精品影院在线观看| 国产精品无码永久免费888| 久久精品中文字幕免费mv| 你懂的国产精品永久在线| 亚洲一区二区在线观看视频| 欧美在线观看视频一区二区三区| 亚洲国产片色| 亚洲精品日产精品乱码不卡| 欧美日韩视频在线| 亚洲视频免费| 欧美一级大片在线观看| 影音先锋久久资源网| 欧美高清成人| 国产精品久久久久久久久久免费 | 欧美日韩精品免费看| 欧美一区二区三区免费视| 欧美1区2区| 久久精品国产免费观看| 欧美激情亚洲国产| 久久亚洲二区| 国产精自产拍久久久久久| 欧美激情区在线播放| 国产区欧美区日韩区| 亚洲精品一区二区三区在线观看| 国产午夜精品视频| 亚洲精品一区二区网址| 亚洲国产日日夜夜| 欧美一区在线视频| 亚洲欧美综合| 欧美视频在线不卡| 91久久国产综合久久| 一区二区亚洲精品国产| 亚洲欧美日韩在线| 欧美亚洲综合在线| 国产精品久久久久久久电影 | 久久se精品一区精品二区| 亚洲自拍偷拍麻豆| 欧美日韩免费在线| 亚洲精品日产精品乱码不卡| 亚洲精品一区在线观看香蕉| 免费观看欧美在线视频的网站| 久久亚洲精品视频| 狠狠色丁香久久婷婷综合丁香 | 亚洲丰满少妇videoshd| 在线欧美三区| 久久福利电影| 久久久久久久一区二区| 国产精品视频网| 亚洲一二三级电影| 欧美一级大片在线观看| 欧美午夜不卡视频| 中文在线资源观看网站视频免费不卡 | 久久疯狂做爰流白浆xx| 久久久精品五月天| 依依成人综合视频| 另类专区欧美制服同性| 欧美sm极限捆绑bd| 亚洲国产精品久久久久久女王| 欧美人与禽猛交乱配视频| 亚洲一区免费视频| 欧美日韩日韩| 99国产精品久久久久久久| 99精品国产高清一区二区| 亚洲男女毛片无遮挡| 欧美黄色片免费观看| 亚洲激情偷拍| 中文国产成人精品久久一| 欧美日韩理论| 亚洲欧美国产va在线影院| 久久经典综合| 亚洲高清不卡av| 欧美—级a级欧美特级ar全黄| 亚洲剧情一区二区| 欧美一区二区免费| 亚洲第一中文字幕| 欧美日韩视频专区在线播放 | 亚洲美女视频网| 亚洲欧美视频一区| 激情欧美一区| 欧美日韩国产专区| 久久精品国产第一区二区三区| 欧美高清在线播放| 亚洲免费一在线| 樱桃国产成人精品视频| 欧美日韩国产综合视频在线观看中文| 亚洲欧美日韩综合| 最近看过的日韩成人| 欧美在线观看网址综合| 亚洲国产精品久久久久秋霞不卡| 欧美午夜一区| 免费黄网站欧美| 亚洲欧美另类中文字幕| 亚洲国产99| 久久久www成人免费毛片麻豆| 日韩视频在线一区| 国语自产精品视频在线看一大j8| 欧美日韩免费观看一区二区三区| 久久久91精品国产一区二区三区| 91久久夜色精品国产九色| 欧美性一区二区| 欧美激情亚洲| 美女被久久久| 久久福利精品| 先锋影音网一区二区| 亚洲精品国产无天堂网2021| 久久久之久亚州精品露出| 亚洲午夜精品久久| 欧美在线亚洲一区| 夜久久久久久| 欧美一区二区三区免费看| 亚洲乱码国产乱码精品精天堂|