Avatar billede krukken Juniormester
05. november 2004 - 05:43 Der er 19 kommentarer og
1 løsning

mutex beskyttelse af funktioner

Hej,

Jeg har to spørgsmål som jeg ønsker besvaret:
1: Jeg har to tråde som tilgår den sammen resource hvordan laver jeg en mutex som beskytter den? Problemet er vel at begge tråde skal kende de sammen mutex?(JEG BRUGER LINUX)

Programmet virker på denne måde:
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 skal have besked om at den kan køres. Den anden process bliver kørt ca. hvert 10 minuter.

2. Når man kompiler på linux er der så ikke en måde hvor man kan tilføje en options så man får mere at vide om grunden hvis programmet cracher? Problemet er at jeg har efterhånden lavet er stort og kompekst systemet. Og det kører faktisk rigtig fint, men efter 36 timer får jeg pludselig en "segment fail" - og jeg har jo inden mulighed for at finde fejl på den baggrund.

Pointene vil blive delt lige immellem spørgsmålene.
Avatar billede arne_v Ekspert
05. november 2004 - 08:02 #1
re 1)

strukturer:

pthread_mutex_t
pthread_mutexattr_t

funktioner:

pthread_mutexattr_init
pthread_mutex_init
pthread_mutex_lock
pthread_mutex_unlock

bare lav en global variabel den kan ses af begge tråde.
Avatar billede arne_v Ekspert
05. november 2004 - 08:02 #2
fortsat re 1)

Har du ikke spurgt om det før ?

re 2)

Ingen anelse
Avatar billede krukken Juniormester
05. november 2004 - 11:53 #3
Nu opretter jeg denne mutex i main. Der hvor begge tråde bliver startet.

Men trådene kan ikke se mutexen. Hvad skal jeg gøre for at begge tråde(som er to forskellige klasser, der ligger i to forskellige filer) kan se mutexen?
Avatar billede arne_v Ekspert
05. november 2004 - 11:59 #4
Ganske normalt.

minmutex.h:

extern pthread_mutex_t minmutex;

Og så:

#include "minmutex.h"

i alle .cpp filer.
Avatar billede krukken Juniormester
05. november 2004 - 12:19 #5
Okay - jeg har gjort det på en lidt anden måde.

Jeg har laget mutexen i en klasser der heddder Thread, hvor begge tråde nedarver fra. I denne klasser er den gjort protected, og arven er public. Så dermed kan mutexen ses i de to tråd klasser.

Det kompiler også fint nu - men programmet "starter" aldrig. Det er som om den unlock-metode ikke virker?
Avatar billede arne_v Ekspert
05. november 2004 - 12:24 #6
Ja.

Er den static ?

Hvis ikke så har du jo 2 instanser af den mutex og så syncher den jo ikke så godt.
Avatar billede krukken Juniormester
05. november 2004 - 12:33 #7
Skal den ikke oprettet på denne måde under medlemsvariablerne?
pthread_mutex_init(&g_mutex,NULL);

Jeg får nemlig følgende fejl når der linkes:
:
: undefined reference to `Thread::mutex'
Thread1.o(.text+0xc90): In function `Statistics::tmain()':
: undefined reference to `Thread::mutex'
collect2: ld returned 1 exit status
make: *** [Test] Error 1

Dette er den første tråd som ikke kan se den
Avatar billede krukken Juniormester
05. november 2004 - 12:34 #8
Hov, det var selvfølge sådan her jeg mener at den skal oprettes i Thread-klassen:
static pthread_mutex_t mutex;
Avatar billede krukken Juniormester
05. november 2004 - 12:36 #9
Det ser ud til at Thread1.cpp kan udføre denne handling:
thread_mutex_lock(&mutex);
Avatar billede arne_v Ekspert
05. november 2004 - 12:38 #10
static embers af klasser skal erklæres udenfor klassen sammen med den
andre implementationer af klassen:

pthread_mutex_t Thread::mutex;
Avatar billede krukken Juniormester
05. november 2004 - 12:47 #11
#ifndef THREAD_H
#define THREAD_H

#include <pthread.h>

class Thread{
  public:
  Thread();
  virtual ~Thread();
  void run();
  void join();
 

  protected:
  virtual void tmain() = 0;
  static void* entry(void*);
 
  private:
  pthread_t thread_id;
};
static pthread_mutex_t Thread::mutex;
#endif

Dette giver følgende fejl:
Thread.h:21: `static' may not be used when defining (as opposed to declaring) a
  static data member
Thread.h:21: `pthread_mutex_t Thread::mutex' is not a static member of `class
  Thread'
make: *** [Thread.o] Error 1
Avatar billede arne_v Ekspert
05. november 2004 - 13:06 #12
class Thread{
...
  static pthread_mutex_t mutex;
};

pthread_mutex_t Thread::mutex;
Avatar billede krukken Juniormester
05. november 2004 - 13:19 #13
Thread2.o(.bss+0x0): multiple definition of `Thread::mutex'
Thread.o(.bss+0x0): first defined here
Driver.o(.bss+0x4): multiple definition of `Thread::mutex'
Thread.o(.bss+0x0): first defined here
Thread1.o(.bss+0x0): multiple definition of `Thread::mutex'
Thread.o(.bss+0x0): first defined here

Hvad betyder det? Jeg har endda udkommenteret alt med mutexen i de Thread1 og 2
Avatar billede arne_v Ekspert
05. november 2004 - 13:25 #14
class Thread{
...
  static pthread_mutex_t mutex;
};

skal være i en .h fil som inkluderes i mange .cpp filer

pthread_mutex_t Thread::mutex;

skal kun være i en .cpp fil
Avatar billede krukken Juniormester
05. november 2004 - 13:44 #15
Okay - jeg ved ikke lige hvad der gik galt. Men jeg prøvede at slette alle min .o filer og nu compiler og linker den fint.

Angående spørgsmål 2:
Jeg har hørt noget om en options -verbose- Hvad bruges den til?
Avatar billede arne_v Ekspert
05. november 2004 - 14:30 #16
Er det ikke en compiler option ?
Avatar billede krukken Juniormester
05. november 2004 - 14:33 #17
Det ved jeg ikke. Jeg har bare hørt den omtalt i forbindelse med udvikling af programmet på linux. Har du hørt om den i nogen forbindelser?
Avatar billede arne_v Ekspert
05. november 2004 - 14:39 #18
gcc/g++ og mange andre linux programmer har en verbose option.

Se f.eks.:
  http://www.network-theory.co.uk/docs/gccintro/gccintro_63.html
Avatar billede krukken Juniormester
13. november 2004 - 12:31 #19
Arve_v >> ligger du et svar?
Avatar billede arne_v Ekspert
13. november 2004 - 13:02 #20
kommer her
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