CCASQueue+多个消费者线程

inz00001 发布于 2016/08/23 11:39
阅读 391
收藏 0

请问,CCASQueue 在多个消费者线程的情况下奔溃了,怎么解决

加载中
0
伤神小怪兽
伤神小怪兽
什么版本?
0
i
inz00001

引用来自“伤神小怪兽”的评论

什么版本?
COMMON 2.3.13  
0
SVD
SVD
是不是线程同步有问题
0
i
inz00001
#include "stdafx.h"
#include "..\..\..\..\Common\Src\RingBuffer.h"

CCASQueue<int> pool4;

//////////////////////////////////////////////////////////////////////////
UINT _stdcall ThreadFunc1(LPVOID lpParam)
{
	static long val(0);
	while (1)
	{
		int newval = ::InterlockedIncrement(&val);
		int* p = (int*)&val;
		pool4.PushBack(p);
	}


	return 0;
}

//////////////////////////////////////////////////////////////////////////
UINT _stdcall ThreadFunc2(LPVOID lpParam)
{
	while (1)
	{
		int* p(NULL);
		BOOL b = pool4.PopFront(&p);
	}

	return 0;
}

//////////////////////////////////////////////////////////////////////////
int main()
{
	UINT ThreadID;
	for (int a=0;a<5;a++)
	{
		::_beginthreadex(NULL, 0, ThreadFunc1, NULL, 0, &ThreadID);
	}
	for (int a=0;a<14;a++)
	{
		::_beginthreadex(NULL, 0, ThreadFunc2, NULL, 0, &ThreadID);
	}

	::Sleep(10000000);

	return 0;
}



0
伤神小怪兽
伤神小怪兽
下个版本修复:

BOOL PopFront(T** ppVal)
	{
		ASSERT(ppVal != nullptr);

		if(IsEmpty())
			return FALSE;

		BOOL isOK	= FALSE;
		NPTR pHead	= nullptr;
		NPTR pNext	= nullptr;
		T* pVal		= nullptr;

		while(true)
		{
			while(::InterlockedCompareExchange(&m_lLock, 1, 0) != 0);

			pHead = (NPTR)m_pHead;
			pNext = (NPTR)pHead->pNext;

			if(pNext == nullptr)
			{
				m_lLock = 0;
				break;
			}

			*ppVal	= pNext->pValue;
			m_pHead	= pNext;

			m_lLock = 0;
			isOK	= TRUE;

			::InterlockedDecrement(&m_lSize);

			delete pHead;
			break;
		}

		return isOK;
	}




返回顶部
顶部