Programování ve vláknech – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Programování ve vláknech – C / C++ – Fórum – Programujte.comProgramování ve vláknech – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Miky0120
Duch
28. 10. 2013   #1
-
0
-

 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. 

Nahlásit jako SPAM
IP: 94.113.215.–
Reklama
Reklama
liborb
~ Redaktor
+18
Guru
29. 10. 2013   #2
-
0
-

To jsou prostě vlákna, tam nemůžeš počítat v podstatě s ničím, co se týká časových věcí a hlavně souslednosti. Předpokládám, že funguje tento scénář - založil si lokální proměnnou par, kterou si naplnil i a i + 1, předal si to vláknu, zde očekáváš, že se spustí, ale to se nestane a začne se zakládat další vlákno, proměnnou par to umístí do paměti na stejné místo a přepíše to hodnoty atd. Takže se ti třeba nakonec spustí 10 vláken a všechny mají stejný pointer na stejné hodnoty (ty poslední). A samozřejmě úplně jinak se to bude chovat na vícejádrových procesorech apod.

Doporučuji upravit řádek na začátku vlákna na: 

printf("Startuje vlakno A (%d, %d)\n", pom[0], pom[1]);

Tak si třeba vytvoř vícerozměrné pole par (nebo pole struktur) a každému vláknu předej jeden řádek tohoto pole.

A ještě jedna poznámka, když už jedeš na krásu :), tak místo: 

for(int i = 0; i < R; i++) {
   WaitForSingleObject( v[i], INFINITE );
}

můžeš dát: 

WaitForMultipleObjects(R, v, TRUE, INFINITE);
Nahlásit jako SPAM
IP: 188.75.135.–
Miky0120
Duch
29. 10. 2013   #3
-
0
-

#2 liborb
Děkuji moc za objasnění problému.

Nahlásit jako SPAM
IP: 94.113.213.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 83 hostů

Podobná vlákna

Kniha o vláknech — založil Kowalsky95

Programovaní — založil joskoo

Programovani C++ — založil jonny

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý