ロックなしマルチスレッド処理方式


マルチスレッドにロックをかけるのはすでに業界内の普遍的なやり方のようだが、実際にはロックをかけなくてもいい.例えば、各スレッドに独自の専用キューを設計し、複数のスレッドが同じキューにアクセスして問題を引き起こすことはない.そのため、ロックをかける必要はない.以下のコードは証明できるが、時々崩壊するようだ.牛たちはどこに問題があるか分析することができる.
#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(); }