簡體   English   中英

共享數據並強制線程之間的鎖定

[英]Sharing data and forcing locks between threads

我和朋友正在制作一個游戲引擎,其中兩個AI正在互相爭斗。 我們試圖以這樣的方式設置游戲引擎線程,即AI線程不能做任何事情,比如減慢游戲速度,或者隨意破壞任何單元等。

我們遇到的問題是我們需要在游戲引擎和AI之間共享數據。 到目前為止,我們使用了synchronize ,但AI可以阻止變量,游戲引擎不再繼續。 或者AI可以選擇不同步和崩潰游戲,這也不是我們想要的。

我們一直在研究Lock的實現,但這似乎假設AI會在使用之前檢查變量是否被鎖定,而一個糟糕的AI當然無法做到。

如果我們的數據被鎖定,我們想要做的是查看可預測的時間。 如果它被鎖定,我們將取消AI的資格。 否則我們繼續游戲。 同步的問題是,進程是默認值,游戲引擎將等待變量解鎖並且可能掛起。

如何鎖定變量/共享數據,以便您可以查看變量是否被鎖定並強制鎖定? 或者是否存在不涉及鎖定的解決方案?

保證這一點的唯一方法是讓AI在中立區域共享信息,而中立區域中任何一個系統都無法控制代碼。 這樣您就可以使用synchronized或Lock或並發集合,但由於AI都無法訪問保存此信息的代碼,因此它們不會對彼此產生負面影響。 我會確保鎖定不會暴露,並由共享存儲控制。

請注意,我們始終只能從同步/鎖定/解鎖上下文中讀取/寫入共享數據。

What we would like to do is look at a predictable time if our data is locked.

是的,你可以這樣做。 使用ReentrantLock。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html

它有Api之類的

 boolean tryLock(); // it will return true if lock available else false

 boolean tryLock(long time, TimeUnit unit) // same as above but will wait for the time 
     // you specify and and also can be interrupted.

還有更多類似於ReadWriteLock的鎖具。請檢查最適合您的要求。

我不確定你的具體要求是什么; 但是,您可以將與“游戲引擎”相關的所有內容僅在“游戲引擎”主題中完成。 它與UI線程類似。 在UI線程中,長時間運行的進程在后台線程中完成; 然而,當UI需要更新時,后台線程需要將更改提交/發布到UI線程,然后自己進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM