- 論壇徽章:
- 0
|
不好意思 可能我上面沒有說清楚
我用的是下面這個(gè)環(huán)形隊(duì)列 無鎖的實(shí)現(xiàn)一個(gè)進(jìn)程讀,一個(gè)進(jìn)程寫,沒有牽涉到其他線程。
這樣的方式把10個(gè)線程串成一條流水線,主線程把指針push到第一個(gè)線程的環(huán)形隊(duì)列,第一個(gè)線程從環(huán)形隊(duì)列里面pop出來一個(gè)數(shù)據(jù)(指針),然后處理(不會(huì)修改這個(gè)指針指向的值),然后把這個(gè)指針插入到下一個(gè)線程的隊(duì)列,下一個(gè)線程也從自己的隊(duì)列里面pop一個(gè)數(shù)據(jù),然后處理,再push到下下個(gè)線程的隊(duì)列。
所以只有一個(gè)線程的隊(duì)列滿了,push不進(jìn)去會(huì)循環(huán)的push,知道能夠push進(jìn)去,或者是隊(duì)列空了,pop出來的數(shù)據(jù)null,會(huì)繼續(xù)pop,這兩種情況下會(huì)忙等,不然是不會(huì)忙等的,而這兩種情況在測(cè)試的時(shí)候很少發(fā)生,對(duì)性能影響應(yīng)該很小。- template<class T>
- class RingQueue {
- public:
- RingQueue() {
- cout << "RingQueue::ctor" << endl;
- };
- virtual ~RingQueue() {
- cout << "RingQueue::destory" << endl;
- };
- void InitQueue() {
- Push_Count = 0;
- Push_Index = 0;
- Pop_Count = 0;
- Pop_Index = 0;
- memset(List, 0, sizeof (List));
- }
- bool Push(const T& AData) {
- if (Push_Count - Pop_Count < Max_Count) {
- List[Push_Index] = AData;
- Push_Count++;
- if (Push_Index == High_Index)
- Push_Index = 0;
- else
- Push_Index++;
- return true;
- } else
- return false;
- }
- T Pop() {
- T result = NULL;
- if (Push_Count != Pop_Count) {
- result = List[Pop_Index];
- Pop_Count++;
- if (Pop_Index == High_Index)
- Pop_Index = 0;
- else
- Pop_Index++;
- }
- return result;
- }
- long size() {
- return this->Push_Count - this->Pop_Count;
- }
- private:
- RingQueue(const RingQueue& orig);
- T List[524288 * 2]; //2^19 4M�ռ�
- const static unsigned long Max_Count = 524288 * 2;
- const static unsigned long High_Index = 524288 * 2 - 1;
- unsigned long Push_Count;
- unsigned long Push_Index;
- unsigned long Pop_Count;
- unsigned long Pop_Index;
- };
復(fù)制代碼 |
|