Exemple #1
0
void OmpMaster::HandleOtherRequests()
{
  if (Requests.front() == "START" && State == WAITING)
  {
  	GetField();
  	InitWorkers();
  	Requests.pop_front();
  	State = STOPPED;
  }
  else 
  	LocalWorker::HandleOtherRequests();
}
void SmpManager::DoWork(TreeNode *w,bool EvalOpt,int credit)
{
	int i;
	if(w->fen[0] == '\0')
	{
		w = w;
		return;
	}
	if(NumThreads == 1)
	{
		// don't schedule.
		ThreadData[0].work.Node = w;
		ThreadData[0].work.EvalOptimism = EvalOpt;
		ThreadData[0].work.CreditNps = credit;
		ThreadData[0].work.DoJob();
		return;
	}
	if(InitDone == false)
	{
		InitWorkers(NumThreads);
		// start smp threads
		while(!SmpWorkers.AllStarted())SmpWorkers.Sleep();
	}
#ifndef _MSC_VER
	while(true)
	{
		for(i = 0; i < NumThreads; i++)
		{
		// buscamos alguien libre
			if(ThreadData[i].Idle && !ThreadData[i].Start )
			{
				ThreadData[i].work.Node = w;
				ThreadData[i].work.EvalOptimism = EvalOpt;
				ThreadData[i].work.CreditNps = credit;
				ThreadData[i].Start = true;
				// liberamos el thread
				pthread_mutex_lock(&ThreadData[i].WaitLock);
				pthread_cond_signal(&ThreadData[i].IdleEvent);
				pthread_mutex_unlock(&ThreadData[i].WaitLock);
				// esperamos a que se ponga en marcha
				while(ThreadData[i].Idle && ThreadData[i].Start){
					Sleep();
				}
				ThreadData[i].Start = false;
				return;
			}
		}
		// no hemos podido lanzarlo cedemos el paso a otro a ver si termina
		Sleep();
	}
#else
	while(true)
	{
		for(i = 0; i < NumThreads; i++)
		{
		// buscamos alguien libre
			if(ThreadData[i].Idle)// && ThreadData[i].Start == false)
			{
				ThreadData[i].work.Node = w;
				ThreadData[i].work.EvalOptimism = EvalOpt;
				ThreadData[i].work.CreditNps = credit;
				ThreadData[i].Start = true;
				// liberamos el thread
				SetEvent(ThreadData[i].IdleEvent);
				// esperamos a que se ponga en marcha
				while(ThreadData[i].Idle && ThreadData[i].Start) Sleep();
				ThreadData[i].Start = false;
				return;
			}
		}
		// no hemos podido lanzarlo cedemos el paso a otro a ver si termina
		Sleep();
	}
#endif
}