Párhuzamosság
A C++/CLI-ben nincsenek (ahogy a .NET 3.x idején egyetlen Microsoft-os CLR nyelvben sem) nyelvi szinten párhuzamos programok írását támogató nyelvi eszközök
A párhuzamosság a Windows szálak segítségével valósítható meg, e szolgáltatáshoz a System::Threading namespace nyújt .NET keretet.
A Thread osztály
Szálak indítására és felügyeletére a System::Threading::Thread osztályt használhatjuk. Az osztály konstruktora egy delegate-t vár, mely a szál belépési pontja lesz.
Opcionálisan elláthatjuk egy Object típusú paraméterrel.
A Thread osztály lehetőségei:
- Suspend(): Thread felfüggesztése
- Resume(): Thread folytatása
- Priority: Thread prioritásának lekérdezése / beállítása
- Abort(): Thread "erőszakos" leállítása
- Join(): Megvárja, míg a thread befejeződik, majd visszatér - opcionálisan megadható maximális várakozási idő
MSDN példa:
using namespace System;
using namespace System::Threading;
public ref class ThreadExample
{
public:
static void ThreadProc()
{
for ( int i = 0; i < 10; i++ )
{
Console::Write( "ThreadProc: " );
Console::WriteLine( i );
Thread::Sleep( 0 );
}
}
};
int main()
{
Console::WriteLine( "Main thread: Start a second thread." );
Thread^ oThread = gcnew Thread( gcnew ThreadStart( &ThreadExample::ThreadProc ) );
oThread->Start();
for ( int i = 0; i < 4; i++ )
{
Console::WriteLine( "Main thread: Do some work." );
Thread::Sleep( 0 );
}
Console::WriteLine( "Main thread: Call Join(), to wait until ThreadProc ends." );
oThread->Join();
Console::WriteLine( "Main thread: ThreadProc.Join has returned. Press Enter to end program." );
Console::ReadLine();
return 0;
}
Szinkronizáció: Monitor
A Monitor osztály statikus függvényeit használhatjuk szálak szinkronizációjára. Referencia típusú objektumokat zárolhatunk vele:
- Enter(Object): Objektum zárolása. Ha az objektum zárolt, a hívó szál várakozik
- TryEnter(Object): Objektum zárolása. Ha a zárolás sikeres, a visszatérési érték true; ha az objektum már zárolt, akkor false
- Exit(Object): Objektum zárolásának feloldása