Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C++ mutex přes více funkcí

Dobrý den,
Snažím se udělat dvouvláknovou aplikaci v c++, kde jedno vlákno čte střídavě do dvou bufferů znaky ze souboru a druhé vlákno tyto buffery poté zpracovává. Funguje to celé pomocí eventů. které oboum vláknům říkají, kdy začít s Parsováním bufferu, nebo kdy je možné načítat do bufferu. Přístup k bufferům jsem řešil pomocí mutexů..(viz následující kód)

funkce pro zapisování do bufferu:

	void ReadDataFromPath(){
		DWORD waitResult;

		/*
		Pokud je buffer jedna prazdny, pak do nej nahraji data
		pozn:. dodelat cestu z argumentu a novou funkci pro nahravani dat
		*/
		if(bufferOneIsClear == true){
			waitResult = WaitForSingleObject(mutexBuffer1, INFINITE);
			//if pro kontrolu
			cout<<"Plnim buffer 1.."<<endl;
			Sleep(5000);
			cout<<"Buffer 1 naplnen.."<<endl;
			bufferOneIsClear = false;
			SetEvent(eventToParse);
			ReleaseMutex(mutexBuffer1);
		}else if(bufferOneIsClear == false){
			waitResult = WaitForSingleObject(mutexBuffer2, INFINITE);
			//if pro kontrolu
			cout<<"Plnim buffer 2.."<<endl;
			Sleep(5000);
			cout<<"Buffer 2 naplnen.."<<endl;
			bufferOneIsClear = true;
			SetEvent(eventToParse);
			ReleaseMutex(mutexBuffer2);
		}

		//abych mohl pokracovat v plneni bufferu
		waitResult = WaitForSingleObject(eventToBuffering, INFINITE);
	}
funkce pro čtení z bufferu:
	void ParseDataFromBuffer(){
		DWORD waitResult = WaitForSingleObject( eventToParse, INFINITE);

		if(bufferOneIsClear == false){//ctu z bufferu 1
			waitResult = WaitForSingleObject( mutexBuffer1, INFINITE);
			SetEvent(eventToBuffering);
			cout<<"Ctu z bufferu 1.."<<endl;
			Sleep(8000); //nahrazuje zatim zpracovani
			cout<<"Buffer 1 precten.."<<endl;
			ReleaseMutex( mutexBuffer1);
			return;
		}
		if(bufferOneIsClear == true){//ctu z bufferu 2
			waitResult = WaitForSingleObject( mutexBuffer2, INFINITE);
			SetEvent(eventToBuffering);
			cout<<"Ctu z bufferu 2.."<<endl;
			Sleep(7000);
			cout<<"Buffer 2 precten.."<<endl;
			ReleaseMutex(mutexBuffer2);
			return;
		}
	}
Tuto funkci volám ve vláknu jiné třídy:
	void ThreadStartUp(){
		//while
		while(buffers->getContinueProcessing()){
			buffers->ParseDataFromBuffer();
		}
	}
A zde nastává problém, jelikož bych chtěl zpracovávat data ne přímo ve fci getContinueProcessing(), ale v cyklu while, ve kterém je volána. Tím pádem jsem přidal novou funkci na uvolnění mutexu:
	void ParseDataFromBufferEnd(){
		if(bufferOneIsClear == false){
			ReleaseMutex(mutexBuffer1);
			return;
		}
		if(bufferOneIsClear == true){
			ReleaseMutex(mutexBuffer2);
			return;
		}
	}
..a předchozí fci getContinueProcessing() jsem pozměnil:
	void ParseDataFromBuffer(){
		DWORD waitResult = WaitForSingleObject( eventToParse, INFINITE);
		//nejaky if
		/*
		Pokud je naplnen buffer 1 prazdny, pak ctu z bufferu2 a naopak
		Ihned pred zahajenim cteni posilam event pro buffer, aby moh pokracovat
		v plneni dalsiho bufferu
		*/
		if(bufferOneIsClear == false){//ctu z bufferu 1
			waitResult = WaitForSingleObject( mutexBuffer1, INFINITE);
			SetEvent(eventToBuffering);
			cout<<"Ctu z bufferu 1.."<<endl;
			return;
		}
		if(bufferOneIsClear == true){//ctu z bufferu 2
			waitResult = WaitForSingleObject( mutexBuffer2, INFINITE);
			SetEvent(eventToBuffering);
			cout<<"Ctu z bufferu 2.."<<endl;
			return;
		}
	}
To vše volám ve while cyklu:
	void ThreadStartUp(){
		//while
		while(buffers->getContinueProcessing()){
			buffers->ParseDataFromBuffer();
			Sleep(8000);
			buffers->ParseDataFromBufferEnd();
		}
	}
Ačkoliv kód je defacto stejný, jen rozdělený do více funkcí, tak prostě přestal pracovat.. Vlákno na zpracování se prostě už nikdy nezavolá. Chtěl bych se tedy zeptat, jakým způsobem bych to měl rozdělit, nebo co dělám špatně? Nikde na internetu jsem totiž nenašel příklady přío na toto téma.

Děkuji za odpovědi.

Odpověď na otázku

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny