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