版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——按鍵精靈教程解決多線程資源沖突按鍵精靈教程:解決多線程資源沖突
來源:按鍵學(xué)院
故事就從一位童鞋的凄涼經(jīng)歷說起吧。那是一個(gè)雷雨交加的夜晚
這位童鞋熬夜寫了一個(gè)關(guān)于《赤月傳聞》交易功能的多線程多開腳本。狂喜之余立馬投身測(cè)試
測(cè)試的結(jié)果卻讓他的臉變成了屎色
他開了15個(gè)窗口,掛了半小時(shí),就有10個(gè)窗口崩潰了。
他首先想到的是,會(huì)不會(huì)是電腦不給力,線程開多了導(dǎo)致的崩潰?于是,他只開了5個(gè)窗口
啊~5個(gè)窗口崩了3個(gè)這個(gè)問題困擾了他一個(gè)月,后來才發(fā)現(xiàn)!
原來,游戲里規(guī)定,交易只能是一對(duì)一的他沒有在腳本中做處理
于是,啟動(dòng)腳本之后,所有的號(hào)都爭著和交易號(hào)進(jìn)行交易,
只有一個(gè)窗口搶到了和交易號(hào)交易的機(jī)遇,其它的窗口沒有搶到,就不斷循環(huán)判斷導(dǎo)致窗口崩潰
就像10個(gè)人爭搶一個(gè)茅坑一樣,1個(gè)人搶到了,其余9個(gè)人都掉坑里了……
怎么才能讓他們好好排隊(duì)上廁所呢?好多童鞋可能會(huì)立馬想到互斥體。
將交易的那段代碼用互斥體保護(hù)起來,當(dāng)一個(gè)線程在執(zhí)行交易代碼時(shí),其它的線程就無法進(jìn)行交易操作。
為了便利大家學(xué)習(xí)和使用,我們的06老濕提供了一段Api創(chuàng)立互斥體的代碼范例~
API函數(shù)
要用到三個(gè)Api函數(shù):CreateMutexWaitForSingleObjectReleaseMutex
步驟
1、調(diào)用Api函數(shù):CreateMutex函數(shù)創(chuàng)立一個(gè)新的互斥體,并且將創(chuàng)立之后返回的互斥體句柄賦值給環(huán)境變量:交易
2、交易代碼執(zhí)行之前,調(diào)用Api函數(shù):WaitForSingleObject函數(shù),設(shè)置互斥體使用時(shí)長為30秒。(假使一個(gè)交易操作需要3分鐘,則這里的使用時(shí)長設(shè)置為大于等于30分鐘。)當(dāng)?shù)谝粭l線程執(zhí)行到WaitForSingleObject函數(shù)時(shí),會(huì)獲取30秒的互斥體使用時(shí)長,在這30秒時(shí)間內(nèi),只有第一條線程可以執(zhí)行被互斥體保護(hù)起來的代碼段,其它的線程都在等待。
3、交易代碼執(zhí)行之后,調(diào)用Api函數(shù):ReleaseMutex函數(shù),釋放互斥體使用權(quán)當(dāng)30秒時(shí)間過后,第一條線程會(huì)釋放對(duì)互斥體的控制權(quán),讓給下一條線程使用。
代碼
DeclareFunctionCreateMutexLib\AsLong,ByVallpNameAsString)AsLong
DeclareFunctionReleaseMutexLib\
DeclareFunctionWaitForSingleObjectLib\dwMillisecondsAsLong)AsLong
'DeclareFunctionCloseHandlelib\
Dimenv交易交易=創(chuàng)立互斥體()For10
BeginThread游戲交易Next
Sub游戲交易()//綁定窗口//登錄帳號(hào)//尋覓npc
Call鎖定(交易,30000)//交易
Call解鎖(交易)EndSub
Function創(chuàng)立互斥體()'/*隨機(jī)生成互斥體名稱DimTempStr,i
TempStr=\Fori=0To12Randomize
TempStr=TempStr&Chr((24*Rnd)+65)Next'*/
創(chuàng)立互斥體=CreateMutex(0,true,TempStr)EndFunction
Sub關(guān)閉互斥體(hdr)CallCloseHandle(hdr)EndSub
Function鎖定(Hdr,Max)
鎖定=WaitForSingleObject(Hdr,Max)EndFunction
Function解鎖(Hdr)
CallReleaseMutex(Hdr)EndFunction/*
SubOnScriptExit()TracePrint\關(guān)閉互斥體\Call關(guān)閉互斥體(交易)EndSub'*/
注意1:
本例子中,在創(chuàng)立互斥體時(shí),使用了隨機(jī)產(chǎn)生互斥體的名稱隨機(jī)名稱是以“anjian_mutex_〞開頭并且加上12個(gè)隨機(jī)字母
隨機(jī)名稱這樣繁雜是為了避免名稱沖突,假使有一樣的名稱存在,那么當(dāng)前的互斥體就會(huì)創(chuàng)立失敗注意2:
代碼中還有一個(gè)CloseHandle函數(shù),被解釋掉了
由于,我們的主線程終止得比其它的十條線程快,所以當(dāng)十條線程還在創(chuàng)立啟動(dòng)的過程中,主線程就已經(jīng)終止,并且觸發(fā)了腳本中止事件,執(zhí)行了關(guān)閉互斥體的命令這樣會(huì)導(dǎo)致,剛創(chuàng)立的互斥體被關(guān)閉的狀況
所以,假使主線程終止得比其他線程快,就不要使用關(guān)閉互斥體命令了互斥體所占用的內(nèi)存空間并不大,不關(guān)閉也不影響
那么,假使游戲規(guī)定,登錄帳號(hào)和交易這兩個(gè)操作都只能一個(gè)一個(gè)進(jìn)行操作呢?那么我們就需要設(shè)置兩個(gè)互斥體:登錄互斥體和交易互斥體代碼:
DeclareFunctionCreateMutexLib\AsLong,ByVallpNameAsString)AsLong
DeclareFunctionReleaseMutexLib\
DeclareFunctionWaitForSingleObjectLib\dwMillisecondsAsLong)AsLong
'DeclareFunctionCloseHandlelib\
Dimenv交易,登錄登錄=創(chuàng)立互斥體()交易=創(chuàng)立互斥體()For10
BeginThread游戲交易Next
Sub游戲交易()
//綁定窗口
Call鎖定(登錄,30000)//登錄帳號(hào)Call解鎖(登錄)
//尋覓npc
Call鎖定(交易,30000)//交易
Call解鎖(交易)EndSub
Function創(chuàng)立互斥體()'/*隨機(jī)生成互斥體名稱DimTempStr,i
TempStr=\Fori=0To12Randomize
TempStr=TempStr&Chr((24*Rnd)+65)Next'*/
創(chuàng)立互斥體=CreateMutex(0,true,TempStr)EndFunction
Sub關(guān)閉互斥體(hdr)CallCloseHandle(hdr)EndSub
Function鎖定(Hdr,Max)
鎖定=WaitForSingleObject(Hdr,Max)EndFunction
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度環(huán)保企業(yè)設(shè)備采購借款合同3篇
- 第3課《做個(gè)“開心果”》(說課稿)-2023-2024學(xué)年道德與法治二年級(jí)下冊(cè)統(tǒng)編版(五四制)
- 2025年房產(chǎn)居間協(xié)助合同3篇
- 人教版八年級(jí)歷史與社會(huì)上冊(cè)1.2.3 百家爭鳴 說課稿
- 第一單元第一課版面設(shè)計(jì)-說課稿 2023-2024學(xué)年粵教版(2019)初中信息技術(shù)七年級(jí)下冊(cè)
- 第二章第二節(jié)世界的海陸分布 說課稿 2023-2024學(xué)年湘教版地理七年級(jí)上冊(cè)
- 人教版初中歷史與社會(huì)八年級(jí)上冊(cè) 1.2.3 探尋 傳遞-探尋2500年前的孔子及其身后的百家爭鳴 說課稿
- 第三單元《數(shù)一數(shù)(一)》(說課稿)-2023-2024學(xué)年二年級(jí)下冊(cè)數(shù)學(xué)北師大版
- 第二單元《連加、連減》(說課稿)-2024-2025學(xué)年一年級(jí)上冊(cè)數(shù)學(xué)人教版
- 2025年抖音短視頻推廣合作協(xié)議
- 翼狀胬肉病人的護(hù)理
- GB/T 12914-2008紙和紙板抗張強(qiáng)度的測(cè)定
- GB/T 1185-2006光學(xué)零件表面疵病
- ps6000自動(dòng)化系統(tǒng)用戶操作及問題處理培訓(xùn)
- 家庭教養(yǎng)方式問卷(含評(píng)分標(biāo)準(zhǔn))
- 城市軌道交通安全管理課件(完整版)
- 線纜包覆擠塑模設(shè)計(jì)和原理
- TSG ZF001-2006 安全閥安全技術(shù)監(jiān)察規(guī)程
- 部編版二年級(jí)語文下冊(cè)《蜘蛛開店》
- 鍋爐升降平臺(tái)管理
- 200m3╱h凈化水處理站設(shè)計(jì)方案
評(píng)論
0/150
提交評(píng)論