[英]Multithreading 4-Tier Mixed Producer Consumer Pattern - Threads Not Alternating Properly
[英]Unity multithreading producer consumer
我創建了一種情況,生產者類將字符串添加到控制器類中的隊列。 控制器類通知工作程序類有工作,並執行工作,在這種情況下,將字符串附加到文件中。 我無法完成這項工作。 文件已創建,但沒有附加內容。 我在成功的Java中創建了這種情況。 我將這段代碼放在最后。 為了澄清,我需要在C#中解決此問題。
通過使用調試器,我得出的結論是線程在進入等待狀態后不會喚醒。 但是我可能是錯的。
注意:我不想使用協程
生產者方法:
void Start () {
for (int i = 0; i < 100; i++)
{
Ccontroller.Instance.AddWork("no: " + i);
}
}
控制器類對於鎖定,我嘗試使用Monitor.enter / exit和當前解決方案。 為了方便起見,我更改了實現方式。 此實現使用工作程序靜態隊列。 線程需要靜態隊列。
public class Ccontroller : Singleton<Ccontroller>
{
public Queue<string> workLoad = new Queue<string>();
public Worker worker;
public Object lockGetWork = new Object();
public void AddWork(string toProcess)
{
Worker.workload.Enqueue(toProcess);
lock (lockGetWork)
{
Monitor.PulseAll(lockGetWork);
}
}
public string GetWork()
{
string process;
process = workLoad.Dequeue();
return process;
}
}
工人階級:公共階級工人:MonoBehaviour {
static string path = @"d:\test.txt";
Thread t;
public static Queue<string> workload = new Queue<string>();
private void Awake()
{
t = new Thread(Work);
}
// Use this for initialization
void Start()
{
//create file
if (!File.Exists(path))
{
using (StreamWriter sw = File.CreateText(path)) { }
}
t.Start();
}
static void Work()
{
while (true)
{
if (workload.Peek() != null)
{
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine(workload.Dequeue());
}
}
else
{
Monitor.Wait(Ccontroller.Instance.lockGetWork);
}
}
}
}
Java代碼中的代碼和所需的情況:生產者類中的方法:
public void StartWork(){
for(int i=0; i<200; i++){
controller.AddWork("work order: "+i);
}
}
控制器:
public class WorkController {
private Queue<String> workload = new ArrayDeque<String>();
private AtomicInteger LockAdd = new AtomicInteger();
private AtomicInteger LockRemove = new AtomicInteger();
public void AddWork(String work){
workload.add(work);
synchronized(LockAdd){
LockAdd.notify();
}
}
public String RemoveWork(){
String work;
synchronized(LockRemove){
work= workload.remove();
}
return work;
}
}
工人:
public class Worker {
public WorkController controller;
Thread work = new Thread(){
public void run(){
while(true){
try{
System.out.println(controller.RemoveWork());
}catch(NoSuchElementException ex){
System.out.println("no work");
try {
wait();
} catch (InterruptedException ex1) {
Logger.getLogger(Worker.class.getName()).log(Level.SEVERE, null, ex1);
}
}
}
}
};
void StartWorker(){
work.start();
}
}
解決問題的原因是:在Unity和/或c#中,您似乎在同一對象的Lock語句中執行Monitor.wait。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.