CCASQueue+多个消费者线程

发布于 2021-12-03 11:55:46 字数 42 浏览 715 评论 5

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

秉烛思 2021-12-04 01:18:45

下个版本修复:

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;
	}

断爱 2021-12-04 01:11:39
#include "stdafx.h"
#include "........CommonSrcRingBuffer.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;
}

妖妓 2021-12-04 00:54:58

是不是线程同步有问题

旧伤慢歌 2021-12-04 00:43:59

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

什么版本?

冷默言语 2021-12-03 13:20:27

什么版本?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文