// Sekcja krytyczna jako zmienna globalna
RCriticalSection SekcjaKrytyczna;

TInt DopiszDoPliku( const TDesC8& aDane )
{
    // Implementacja zostaa pominita.
}

// Funkcje wtkw
TInt FunkcjaWatkuPierwszego( TAny* /*aPtr*/ )
{    
    HBufC8* dane = NULL;
    // Przygotowanie danych do zapisu...
    
    SekcjaKrytyczna.Wait();    // Wejcie do sekcji krytycznej
    TInt blad = DopiszDoPliku( *dane );
    SekcjaKrytyczna.Signal();    // Wyjcie z sekcji krytycznej
    
    delete dane;
    return blad;
}

TInt FunkcjaWatkuDrugiego( TAny* /*aPtr*/ )
{
    HBufC8* dane = NULL;
    // Przygotowanie danych do zapisu...
    
    SekcjaKrytyczna.Wait();    // Wejcie do sekcji krytycznej
    TInt blad = DopiszDoPliku( *dane );
    SekcjaKrytyczna.Signal();    // Wyjcie z sekcji krytycznej
    
    delete dane;
    return blad;
}

// ----------------------------------
// ------ Wtek gwny procesu ------
// ----------------------------------

// Tworzymy sekcj krytyczn do synchronizacji wtkw w biecym procesie.
User::LeaveIfError( SekcjaKrytyczna.CreateLocal() );

// Tworzymy wtki.
_LIT( KPierwszyWatek, "Watek1" );
_LIT( KDrugiWatek, "Watek2" );

TInt blad = iPierwszyWatek.Create( KPierwszyWatek, 
                    FunkcjaWatkuPierwszego,
                    KDefaultStackSize,
                    NULL,    // aHeap = NULL, uywamy sterty wtku gwnego.
                    NULL );    // Nie przekazujemy do wtku parametrw.
User::LeaveIfError( blad );

blad = iDrugiWatek.Create( KDrugiWatek, 
                FunkcjaWatkuDrugiego,
                KDefaultStackSize,
                NULL,    // aHeap = NULL, uywamy sterty wtku gwnego.
                NULL );    // Nie przekazujemy do wtku parametrw.
User::LeaveIfError( blad );

// Oba wtki zostay utworzone pomylnie.
iPierwszyWatek.Resume();
iDrugiWatek.Resume();
