Ik ben een beetje aan het spelen met meerdere threads in C#
Quicksort is makkelijk aan te passen naar multithreading omdat het telkens het op te lossen probleem in 2 stukken hakt en elk afzonderlijk oplost.
Echter kom ik er niet uit hoe ik dit moet doen in C#
De functie ziet er ongeveer zo uit
Wat ik nu zou willen is
Ik kom 2 opties tegen om te kunnen multithreaden, dat zijn ThreadPool en Thread.
Als ik ThreadPool gebruik kan ik via QueueWorkerItem een functie op een lijst zetten die uitgevoerd wordt zodra er een thread vrij is.
De functie die aangeroepen is kan ik 1 argument meegeven wat een structure kan zijn met daarin de gegevens die de functie nodig heeft.
Tot zover is het goed, maar het wachten tot de thread klaar is lijkt onmogelijk.
Via de class Thread kan ik met Join() wachten op de andere thread zodat ik weet wanneer deze klaar is, maar deze heeft weer als nadeel dat ik geen structure kan meegeven met de informatie wat hij moet doen.
Wat ik kan vinden om deze data mee te geven is dat ik een aparte class moet maken en de data erin stoppen en vervolgens de ThreadProc van de nieuwe thread een function uit deze class meegeven.
Ik vind het eigenlijk al een beetje omslachtig om voor die ThreadPool een structure te maken en vullen, laat staan dus een hele class met functies om het via Thread te doen.
Is hier niet een makkelijkere oplossing voor?
Tot nu toe kan ik dus alleen deze 2 oplossingen vinden (waarvan de 1e dus eigenlijk niet eens gaat werken).
Ik heb gezocht in het boek Microsoft .Net framework application development foundation (70-536) en via google.
Quicksort is makkelijk aan te passen naar multithreading omdat het telkens het op te lossen probleem in 2 stukken hakt en elk afzonderlijk oplost.
Echter kom ik er niet uit hoe ik dit moet doen in C#
De functie ziet er ongeveer zo uit
C#:
1
2
3
4
5
6
7
8
| public void Sort(int[] buffer, int startPosition, int endPosition, int threadDepth) { // <knip> code die ervoor zorgt dat van startPosition tot buffer[i] lagere waarden // heeft dan buffer[i] en na i tot endPosition grotere waarden heeft Sort(buffer, startPosition, i - 1, 0); Sort(buffer, i + 1, endPosition, 0); } |
Wat ik nu zou willen is
C#:
1
2
3
4
5
6
7
8
9
| public void Sort(int[] buffer, int startPosition, int endPosition, int threadDepth) { // <knip> code die ervoor zorgt dat van startPosition tot buffer[i] lagere waarden // heeft dan buffer[i] en na i tot endPosition grotere waarden heeft start_in_een_nieuwe_thread ( Sort(buffer, startPosition, i - 1, 0) ); Sort(buffer, i + 1, endPosition, 0); wacht_op_andere_thread } |
Ik kom 2 opties tegen om te kunnen multithreaden, dat zijn ThreadPool en Thread.
Als ik ThreadPool gebruik kan ik via QueueWorkerItem een functie op een lijst zetten die uitgevoerd wordt zodra er een thread vrij is.
De functie die aangeroepen is kan ik 1 argument meegeven wat een structure kan zijn met daarin de gegevens die de functie nodig heeft.
Tot zover is het goed, maar het wachten tot de thread klaar is lijkt onmogelijk.
Via de class Thread kan ik met Join() wachten op de andere thread zodat ik weet wanneer deze klaar is, maar deze heeft weer als nadeel dat ik geen structure kan meegeven met de informatie wat hij moet doen.
Wat ik kan vinden om deze data mee te geven is dat ik een aparte class moet maken en de data erin stoppen en vervolgens de ThreadProc van de nieuwe thread een function uit deze class meegeven.
Ik vind het eigenlijk al een beetje omslachtig om voor die ThreadPool een structure te maken en vullen, laat staan dus een hele class met functies om het via Thread te doen.
Is hier niet een makkelijkere oplossing voor?
Tot nu toe kan ik dus alleen deze 2 oplossingen vinden (waarvan de 1e dus eigenlijk niet eens gaat werken).
Ik heb gezocht in het boek Microsoft .Net framework application development foundation (70-536) en via google.
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22