Ahojte, seznamuji se s programováním ve vláknech.Vytvořil jsem si dvourozměrné pole o velikosti 10x10, které jsem naplnil náhodnými čísly. Každý řádek pole jsem setřídil bubblesortem, tak že jsem si vzal na pomoc 10 vláken.Dále jsem si vytvořil jen jednu funkci pro vlákna, které předávám parametr, jaký řádek pole chci setřídit.
#include<iostream>
#include<time.h>
#include <windows.h>
using namespace std;
const int R = 10;
const int S = 10;
char pole2[R][S];
void naplnPole2(int velikostRadek, int velikostSloupec)
{
srand(time(0));
for(int i = 0; i < velikostRadek; i++)
{
for(int j = 0; j < velikostSloupec; j++)
{
char r = rand() % 200 - 100;
pole2[i][j] = r;
}
}
}
void tiskPole2(int velikostRadek, int velikostSloupec)
{
for(int i = 0; i < velikostRadek; i++)
{
for(int j = 0; j < velikostSloupec; j++)
{
printf("%d ", pole2[i][j]);
}
cout << endl;
}
}
void bubbleSort2(int od, int konec, int sloupec){
for(int r = od; r < konec; r++) {
for(int i = 0; i < sloupec - 1; i++){
for(int j = 0; j < sloupec - i - 1; j++){
if(pole2[r][j+1] > pole2[r][j]){
int tmp = pole2[r][j + 1];
pole2[r][j+1] = pole2[r][j];
pole2[r][j] = tmp;
}
}
}
}
}
int kolik_ms( LPFILETIME pred, LPFILETIME po )
{
hyper pred64b = pred->dwHighDateTime;
pred64b = ( pred64b << 32 ) | pred->dwLowDateTime;
hyper po64b = po->dwHighDateTime;
po64b = ( po64b << 32 ) | po->dwLowDateTime;
// konverze 100ns -> 1ms
return ( int ) ( ( po64b - pred64b ) / 10000 );
}
DWORD WINAPI vlaknoA( LPVOID r1)
{
int *pom = (int*)r1;
printf( "Startuje vlakno A\n" );
bubbleSort2(pom[0],pom[1],S);
return 0;
}
int main()
{
FILETIME cas_pred, cas_po;
HANDLE v[R];
naplnPole2(R,S);
GetSystemTimeAsFileTime( &cas_pred );
int par[] = {0,1};
int par1[] = {1,2};
int par2[] = {2,3};
int par3[] = {3,4};
int par4[] = {4,5};
int par5[] = {5,6};
int par6[] = {6,7};
int par7[] = {7,8};
int par8[] = {8,9};
int par9[] = {9,10};
v[0] = CreateThread( 0, 0, vlaknoA, par, 0, 0 );
v[1] = CreateThread( 0, 0, vlaknoA, par1, 0, 0 );
v[2] = CreateThread( 0, 0, vlaknoA, par2, 0, 0 );
v[3] = CreateThread( 0, 0, vlaknoA, par3, 0, 0 );
v[4] = CreateThread( 0, 0, vlaknoA, par4, 0, 0 );
v[5] = CreateThread( 0, 0, vlaknoA, par5, 0, 0 );
v[6] = CreateThread( 0, 0, vlaknoA, par6, 0, 0 );
v[7] = CreateThread( 0, 0, vlaknoA, par7, 0, 0 );
v[8] = CreateThread( 0, 0, vlaknoA, par8, 0, 0 );
v[9] = CreateThread( 0, 0, vlaknoA, par9, 0, 0 );
WaitForSingleObject( v[0], INFINITE );
WaitForSingleObject( v[1], INFINITE );
WaitForSingleObject( v[2], INFINITE );
WaitForSingleObject( v[3], INFINITE );
WaitForSingleObject( v[4], INFINITE );
WaitForSingleObject( v[5], INFINITE );
WaitForSingleObject( v[6], INFINITE );
WaitForSingleObject( v[7], INFINITE );
WaitForSingleObject( v[8], INFINITE );
WaitForSingleObject( v[9], INFINITE );
GetSystemTimeAsFileTime( &cas_po );
tiskPole2(R,S);
cout << "Cas srotovani: " << kolik_ms(&cas_pred, &cas_po) << "ms" << endl;
return 0;
}
Kód v mainu se mi nelíbí, chtěl jsem ho nahradit za:
int main()
{
FILETIME cas_pred, cas_po;
HANDLE v[R];
naplnPole2(R,S);
GetSystemTimeAsFileTime( &cas_pred );
for(int i = 0; i < R; i++)
{
int par[] = {i, i + 1};
v[i] = CreateThread( 0, 0, vlaknoA, par, 0, 0 );
}
for(int i = 0; i < R; i++)
{
WaitForSingleObject( v[i], INFINITE );
}
GetSystemTimeAsFileTime( &cas_po );
tiskPole2(R,S);
cout << "Cas srotovani: " << kolik_ms(&cas_pred, &cas_po) << "ms" << endl;
return 0;
}
Tady nastává můj problém, když použiji tenhle kód sešrotuje se mi jen poslední řádek.Byl bych moc rád, za každou radu, jak se s tímto problémem vypořádat.