使用C 的泛型佇列Queue實現生產消費模式

2021-09-07 22:36:39 字數 1630 閱讀 2246

本篇體驗使用c#的泛型佇列queue實現生產消費模式。

如果把生產消費想像成自動流水生產線的話,生產就是流水線的物料,消費就是某種裝置對物料進行加工的行為,流水線就是佇列。

現在,要寫乙個體現生產消費模式的泛型幫助類,比如叫producerconsumer。

該類肯定會維護乙個有關生產、物料的queue型別的字段,還存在乙個有關消費、action型別的字段。

在producerconsumer類的建構函式中,為action型別的字段賦值,並開啟後台有關消費的執行緒。

producerconsumer類肯定存在乙個進佇列的方法,並且要保證在多執行緒情況下,同一時間只有乙個生產或物料進入佇列。

producerconsumer類還存在乙個有關消費的方法,並且保證在多執行緒情況下,同一時間只有乙個生產或物料出列,並消費它。

另外,在生產或物料在出佇列的時候,可能會出現佇列中暫時沒有生產或物料的情況,這時候我們希望執行緒阻塞一下,這需要通過autoresetevent實現。autoresetevent的大致原理是:當生產或物料進入佇列的時候需要告訴autoresetevent一下,當佇列中暫時沒有生產或物料的時候,也需要告訴autoresetevent,讓它來阻塞執行緒。

//有關生產消費的泛型類
public class producerconsumer<

t>

this.consumeraction = consumeraction;
//後台開啟乙個執行緒開始消費生產者
new thread(this.consumeitems).start();
}
//進列
public void enqueue(t item)
}
//消費動作
private void consumeitems()
}
//如果生產者存在,才消費生產者
if (doesitemexist)
else//否則的話,再等等下乙個佇列中的生產者
}
}
}
客戶端,針對多執行緒情形。

class program
});
var t2 = new thread(() =>
});
t1.start();
t2.start();
t1.join();
t2.join();
thread.sleep(50);
console.readkey();
}
}

C 佇列Queue的使用

今天用到的c 內建的queue佇列來進行重試機制。基本的用法就是入佇列 enqueue 出佇列 dequeue 介面拉取資料,介面可能不穩定會拉取失敗,我將失敗的記錄存入了queue然後進行重試,直到全部成功為止。queue errorqueue new queue 將所有失敗的記錄都存入佇列 er...

C 泛型 使用泛型List

一 泛型的優點 效能高。從前面的例子可以看出使用不需進行型別轉換,可以避免裝箱和拆箱操作,提高效能。型別安全。泛型集合對其儲存物件進行了型別約束,不是定義時宣告的型別,是無法儲存到泛型集合中的,保證了資料型別的安全。重用。使用泛型型別可以最大限度地重用 保護型別的安全以及提高效能。使用泛型 使用泛型...

C 泛型 使用泛型List

一 泛型的優點 效能高。從前面的例子可以看出使用不需進行型別轉換,可以避免裝箱和拆箱操作,提高效能。型別安全。泛型集合對其儲存物件進行了型別約束,不是定義時宣告的型別,是無法儲存到泛型集合中的,保證了資料型別的安全。重用。使用泛型型別可以最大限度地重用 保護型別的安全以及提高效能。使用泛型 使用泛型...