Avatar billede vonsanta Nybegynder
17. december 2001 - 14:09 Der er 5 kommentarer og
1 løsning

Info om synkronisering af tråde i C++

Hejsa :).

Er en C++ newbie. Har programmeret en hel del i Java, men C++ er nyt for mig.

Er løbet ind i problemer vedrørende sylrnonisering af tråde i C++ - det skal vel gøres med kaldt til OS\'et. Jeg bruger Windows og Visual Studio 6.0, men vil såvidt muligt ikke bruge compiler-specifik kode.

Jeg har godt nok fået tråde op og køre, men det kniber med synkroniseringen. Til at starte med vil jeg bare have en simepl mutex, men vil også lave en monitor senere. har lige lånt en bog \"Object oriented multithreading using c++\", men har ikke fået fat på, lige hvordan man bruger mutexobjekter. Man laver et kald til oS\'et, som opretter et mutexobjekt virker det som. Men hvordan smider man dette objekt mellem forskellige tråde?

Hiv der er nogen som ved dette eller har links til mere information om tråde i C++, vil jeg sætte stor pris på det. Neklager min dansk: har boet i Sverige i mange år, så dank er ikke mit stærkeste sprog :).

--
vonSanta
Avatar billede vonsanta Nybegynder
17. december 2001 - 14:11 #1
Err, *dansk* er ikke mit stærkeste sprog. LOL
Avatar billede wisen Nybegynder
17. december 2001 - 14:13 #2
Du \"smider\" rundt med en mutex vha. af dens navn...
Avatar billede wisen Nybegynder
17. december 2001 - 14:17 #3
Prøv ect at kikke her : http://www.codeproject.com/threads/
Avatar billede soepro Nybegynder
17. december 2001 - 14:53 #4
Mutex objectet i windows ligner en såkaldt kritisk section, dvs. når du allokerer din mutex (som i sin tur styrer hvornår en process kan få adgang til f.eks. globale variable) så kan andre porcesser ikke tilgå den. Du skal så slippe den igen, når du er færdig vha. ReleaseMutex.

Princippet er:

get/wait for mutex;
manipluate global var;
release mutex;

Du skal have samme konstruktion i alle tråde. Den bedste måde at gøre det på, er ved at lave en ny klasse til formalået, og pakker mutex håndteringen ned i setter/getter rutinerne:

class globalMutex
{
  private:
  int globalInt;
  mutex mutexName;

  public:
  int getGlobalInt(void);
  void getGlobalInt(int v);
};

globalMutex::globalMutex(void)
{
  mutexName = CreateMutex(this);
}
int globalMutex::getGlobalInt(void)
{
  int returnValue;
  OpenMutex(mutexName);
  returnValue = globalInt;
  ReleaseMutex(mutexName);
}
void globalMutex::setGlobalInt(int v)
{
  OpenMutex(mutexName);
  globalInt = v;
  ReleaseMutex(MutexName);
}

Kig i Win32 SDK Programmer\'s ref. for den helt korrekte syntax omkring Mutex\'er - d.o. viser princippet.
 
Avatar billede soepro Nybegynder
17. december 2001 - 14:56 #5
Mht. at få mutex\'en smidt rundt, så gør du det f.eks. i forbindelse med din constructor til trådene, hvor du så overfører d.o. mutex-klasse:

myThread::myThread(hWnd HWND, globalMutex *mutex) : Thread(HWND)
{
  this.mutexName = mutex;
}
 
Avatar billede vonsanta Nybegynder
17. december 2001 - 17:13 #6
Mange tak for det! Nu kan jeg komme videre :). C++ er en del anderledes end java, men indtil videre kan jeg godt lide alle de muligheder sproget tilbyder, men det virker som det kan gå lang tid før jeg bliver OK til sproget, heh :)

--
vonSanta
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester