Toon posts:

[C++] pthreads.. lock en unlock

Pagina: 1
Acties:

Verwijderd

Topicstarter
Goeie morge idereen.
Ik ben bezig met C++ en ptheads. Heb al met google gezocht en de search hier en tal van prachtige uitleg gelezen en voorbeelden doorgenomen..
maar jaja je raadt t al.. heb t nog niet werkend :/
zou iemand mij kunnen helpen ..? ik vraag hier niet om dom weg code,
maar gewoon een zetje in de goede richting... TIA..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <pthread.h>
#include "errors.h"

#define N 3
#define MAX 9

pthread_mutex_t mutex;

void *c(void*);
void *p(void*);

int teller=0;
int buf[20]={0};

int main ()
{
    int status;
    pthread_t thread,thread1;
    pthread_mutex_init(&mutex,NULL);

    printf ("hoofdprogramma\n");
    status = pthread_create (  &thread,  NULL, c ,NULL);
    if (status != 0)   err_abort (status, "Create thread");
    status = pthread_create (  &thread1, NULL, p ,NULL);
    if (status != 0)   err_abort (status, "Create thread");
    pthread_join(thread,NULL);
    pthread_join(thread1,NULL);
}
void *c(void *arg)
{
    int t=0;
    while(t<MAX)
    {
      if(teller>0)
      {
        printf("consument  teller=%d  %d \n",teller, buf[teller-1]); 
        teller--;                            
        t++;                                 
      }
    }
}

void *p(void *arg)
{
    int t=0;
    while(t<MAX)        
    {
      if(teller<N)      
      {
       pthread_mutex_lock(&mutex);printf("locked"); // lock werkt niet 
       buf[teller]=t;
       usleep(1);       // slaap nu maar even lekker functie
                   teller++;         
                   pthread_mutex_unlock(&mutex);printf("unlocked");// unlock werkt niet
       t++;          
      }             
    }   
    return NULL;
}

het lukt me dus niet, om de teller en/of buffer te beveiligen op het moment dat p fftjes slaapt, c gaat namelijk doodleuk verder terwijl de mutex gelocked is.. of hoort te zijn..

Verwijderd

Volgens mij had het iets te maken met pthread_mutex_unlock, kan t ook fout hebben hoor...

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Je moet ook lock en unlock ook om code heenzetten die de variabele gebruiken.
Dus er moet ergens in functie c een pthread_mutex_lock en pthread_mutex_unlock komen te staan.

Verwijderd

Topicstarter
maar als ik de mutex weer lock, heb ik een deadlock.. of onvoorspelbaar gedarg (als dus mn literatuur)
met een trylock boven in functie c hangt mn programma ook, ook als ik aan t eind van funcite c een unlock geef...
t idee is dat eerst p wordt uit gevoerd en dan c..

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Even wat documentatie bekeken.
The mutex object referenced by mutex is locked by calling pthread_mutex_lock(). If the mutex is already locked, the calling thread blocks until the mutex becomes available. This operation returns with the mutex object referenced by mutex in the locked state with the calling thread as its owner.
If the mutex type is PTHREAD_MUTEX_DEFAULT, attempting to recursively lock the mutex results in undefined behaviour. Attempting to unlock the mutex if it was not locked by the calling thread results in undefined behaviour. Attempting to unlock the mutex if it is not locked results in undefined behaviour.
Ik snap je bezorgdheid, maar wat hierboven staat heeft betrekking op het locken van een mutex die in dezelfde thread al eerder is gelocked, maar in de tussentijd niet is ge-unlocked.

Een deadlock treedt op als proces A mutex 1 lockt, proces B mutex 2 lockt en proces A vervolgens mutex 2 wil locken, terwijl proces B mutex 1 wil locken. Proces A gaat staan wachten totdat B mutex 2 vrijgeeft. Die zal echter nooit vrijgegeven worden door proces B, omdat deze eerst mutex 1 wil locken, etc....

Een trylock heeft geen zin als je in de tussentijd niet iets anders nuttig met de thread van plan bent.

[ Voor 53% gewijzigd door Sjaaky op 01-04-2003 01:20 . Reden: beetje uitleg erbij ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

The Dining Philosophers over deadlocks.

Professionele website nodig?


Verwijderd

Topicstarter
oh no curry684, niet dat :P ;) , maar idd een goed voorbeeld
maarre bedankt Sjaaky, idd in beide functies dus locken en unlocken, werkt nu prima, engels is nog steeds niet mn sterkste vak :) owe ya one

[ Voor 13% gewijzigd door Verwijderd op 01-04-2003 10:48 . Reden: typos enzo ]

Pagina: 1