ロックなしマルチスレッド処理方式
1340 ワード
マルチスレッドにロックをかけるのはすでに業界内の普遍的なやり方のようだが、実際にはロックをかけなくてもいい.例えば、各スレッドに独自の専用キューを設計し、複数のスレッドが同じキューにアクセスして問題を引き起こすことはない.そのため、ロックをかける必要はない.以下のコードは証明できるが、時々崩壊するようだ.牛たちはどこに問題があるか分析することができる.
#include
#include
#include
using namespace std;
#define N 5
queue 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;
}
//
UINT WINAPI ThreadHandle( void *p )
{
int i = ::InterlockedIncrement(&recvIndex)-1 ;
while (true)
{
if (arr[i].size() > 0)
{
printf("%d ID: %d
", i , arr[i].front());
arr[i].pop();
}
Sleep(10);
}
return 0;
}
int main()
{
::_beginthreadex(0, 0, ThreadRecv, (void *)0, 0, 0);
for (int i = 0; i < 5; ++i)
{
::_beginthreadex(0, 0, ThreadHandle, (void *)0, 0, 0);
}
getchar();
}