Поток, ожидающий сигнала - PullRequest
0 голосов
/ 09 мая 2020

Я делаю программу, которая выводит точки на экран. каждая точка обрабатывается для некоторых взаимодействий с другими точками. а затем redr aws точки в новой позиции и начинается снова. Проблема в скорости. ive попытался разбить обработку списка на несколько потоков, однако накладные расходы замедлили его. Я также пробовал Parallel.ForEach, и он работает намного лучше. однако я думаю, что накладные расходы все еще существуют. Таким образом, обработка новых позиций происходит поэтапным методом.

 private void Step ( ) {
    Parallel.ForEach( AllParticles , ( p ) => {  // has overheads :(
        p.Step( ); // compare to other points
     });
     foreach ( Particle p in AllParticles ) {
        p.Finalise( );
        ...
     }
     Draw( );
}

Теперь я мог бы сделать что-то вроде этого

 //thread delegate
 void ThreadLoop( ) {
    for ( ; ; ) {
        // Wait for signal . . .
        (int start, int end) signal=WaitForSignal();// get a tuple(int,int)
        //process given work
        for(int idx=signal.start; idx < signal.end;idx++) {
            p[ idx ].Step;
        }
        //set a state to indicate now idle
        // repeate and wait for next signal
    }
 }

 List<Thread> CreateAndStart(int numberofthreads ) { // only needs to create threads and delegates once
     List<Thread> result=new List<Thread>();
     // create and start threads add to list...
     return result;
 }

 void Step(){
     //divide the work into [numberOfThread]s
     //send signal to each thread
     //wait untill each thread is idle
     foreach ( Particle p in AllParticles ){
         p.Finalise( );
           ...
     }
     Draw( );
 }

, но я не могу понять, как ввести сигнал и определить, когда хреды ждут. Если у кого-нибудь есть представление о том, как сделать это правильно или есть лучший способ go, я был бы очень благодарен. спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...