Avatar billede krukken Juniormester
09. oktober 2004 - 15:04 Der er 18 kommentarer og
1 løsning

Mutex eller Semaphore med pthread

Hej,

Jeg har to prossor som kører siddeløbende. Princippet bag trådene er at den ene kører hvert sekunder, og når den er færdig frigiver den CPUen. Her forestiller jeg mig at den anden processe igennem en mutex eller semaphore skal have besked om at den kan køres. Den anden process bliver kørt ca. hvert 10 minuter. De har ingen fælles resourcer(data). Jeg kan ikke rigtig finde ud af om jeg skal bruge en mutex eller en semaphore.

Jeg har arbjeder på Linux - VIL have kodeeksempler med små kommentarer.
Avatar billede arne_v Ekspert
09. oktober 2004 - 15:16 #1
Umiddelbart lyder det som om at begge trådene skal have en:

for(;;)
{
  pthread_mutex_lock(&m);
  // gør noget
  pthread_mutex_unlock(&m);
  sleep(n);
}

med n=1 og n=600 og:

pthread_mutex_t m;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutex_init(&m,&attr);

men jeg forstår bare slet ikke behovet for synkronisering hvis ikke de deler
resourcer.
Avatar billede krukken Juniormester
09. oktober 2004 - 15:23 #2
Kan man godt bruge sleep() i under linux? Den vil ikke kompile det.
Avatar billede arne_v Ekspert
09. oktober 2004 - 15:24 #3
Er den ikke i unistd.h ?
Avatar billede arne_v Ekspert
09. oktober 2004 - 15:25 #4
Og husk:

Win32 : windows.h, Sleep med stort s, tid i millisekunder

non Win32 : unistd.h, sleep med lille s, tid i sekunder
Avatar billede krukken Juniormester
09. oktober 2004 - 15:40 #5
non Win32 - hvad gør man så hvis der er tale om nogle milisekunder tråden skal sove?
Avatar billede arne_v Ekspert
09. oktober 2004 - 15:42 #6
Så skal man ikke bruge sleep !

:-)
Avatar billede arne_v Ekspert
09. oktober 2004 - 15:43 #7
På Linux skulle du have usleep og nanosleep !
Avatar billede bertelbrander Novice
09. oktober 2004 - 17:21 #8
Eller du kan lave en ms sleep med select:

void MySleep(int ms)
{
  struct timeval Time;
  Time.tv_sec = 0;
  Time.tv_usec = ms*1000;
  select(0, 0, 0, 0, &Time);
}
Avatar billede krukken Juniormester
09. oktober 2004 - 17:32 #9
Jeg har faktisk allerede en timerklasse som jeg vil bruge - men den er fra Win32, og den kan ikke kompiles under windwos . gider I at hjælpe mig med at kigge på den?
Timer.cpp
**********
include "Timer.h"
Timer::Timer()
{
  stimeSek = 0;
  stimeMsek = 0;
  wantedTime = 0;
}

void Timer::startTimer(int timeInMiliSek)
{
    _ftime( &timebuffer );
    stimeSek = timebuffer.time ;
    stimeMsek = timebuffer.millitm;
    wantedTime = timeInMiliSek;
}

void Timer::stopTimer()
{
  wantedTime = 0;
}

void Timer::resetTimer()
{
    elapseMsek = 0;
}

int Timer::timeLeft()
{
  return  (wantedTime - elapseMsek);
}

bool Timer::timerFinish()
{
    _ftime( &timebuffer );
    elapseMsek =((timebuffer.time - stimeSek)*1000) + (timebuffer.millitm - stimeMsek) ;
   
    if (elapseMsek > wantedTime)
        return true;
    else
    {
        return false;
    }
}
**********

Timer.h
***************
#ifndef TIMER_H
#define TIMER_H
#include "Time.h"
class Timer
{

public:
  Timer();
  void startTimer(int ms);
  void stopTimer();
  void resetTimer();
  int timeLeft();
  bool timerFinish();
 
private:
  int stimeSek;
  int stimeMsek;
  int wantedTime;
  int elapseMsek;
  struct _timeb timebuffer;
};

#endif
**********
Avatar billede krukken Juniormester
09. oktober 2004 - 17:34 #10
Jeg tror at det er typen timeb er ikke er kendt
Avatar billede arne_v Ekspert
09. oktober 2004 - 17:35 #11
Skal du ikke bare fjerne de underscores på ftime og timeb ?
Avatar billede krukken Juniormester
09. oktober 2004 - 17:38 #12
nope - det står stadigvæk: "field timebuffer has incomplete type"
Avatar billede arne_v Ekspert
09. oktober 2004 - 17:40 #13
Også med

#include <sys/timeb.h>

?
Avatar billede krukken Juniormester
09. oktober 2004 - 17:41 #14
Har jeg også med - men samme resultat
Avatar billede arne_v Ekspert
09. oktober 2004 - 17:48 #15
Mystisk.

Med den include og underscorerne fjerner så compiler din kode på min RH7 med GCC 2.96
Avatar billede krukken Juniormester
11. oktober 2004 - 15:48 #16
Ligger I et svar?
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:53 #17
ok

Fik du det til at compile ?
Avatar billede krukken Juniormester
11. oktober 2004 - 16:27 #18
He he - ja. Jeg ved ikke lige hvad der skete. Jeg gik ud og fik noget st spise - også virkede det da jeg kom tilbage:-)
Avatar billede arne_v Ekspert
11. oktober 2004 - 18:58 #19
bertel>

Du fløjter lige hvis du har skiftet mening om point
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