不加锁的多线程处理方式

本文提出了在多线程环境中避免使用锁的一种方法,即为每个线程分配独立的工作队列,以此减少并发冲突。然而,作者发现这种方案可能会导致系统崩溃,并邀请专家分析可能存在的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程中加锁似乎已经是业内普遍做法,其实也可以不加锁,比如设计每个线程有自己的专属队列,不存在多个线程访问同一个队列而引发的问题,因此无需加锁,以下代码即可证明,但貌似有时会崩溃,大牛们可以分析分析哪里有问题!



#include <windows.h>
#include <process.h>
#include <queue>
using namespace  std;

#define  N    5

 
queue <int>  arr[N] ;
int  msgID= 0;  
volatile   long	  recvIndex=0;
 

//获取负荷最小的队列
void  GetRecvIndex(unsigned short  &recvIdx)
{
	recvIdx = USHRT_MAX;
	int num = USHRT_MAX;
	for (WORD i = 0; i <  N ; ++i)
	{
		if (arr[i].size() < num)
		{
			num = arr[i].size() ;
			recvIdx = i;
		}
	}
}


 //接收消息添加到队列 
 UINT  WINAPI ThreadRecv(void  *p)
 {
	 while(true)
	 { 
	    unsigned short   recvIdx = 0;
	    GetRecvIndex(recvIdx); 
	    arr[recvIdx].push(++msgID); 
	     Sleep(5); 
	 }

	 return 0;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员乐逍遥

如果你觉得帮助了你,支持一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值