Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

sleep() and detached threads

[es] :: C/C++ programiranje :: sleep() and detached threads

[ Pregleda: 3060 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

karas

Član broj: 5574
Poruke: 482
*.26.EUnet.yu.



+1 Profil

icon sleep() and detached threads27.01.2006. u 23:58 - pre 221 meseci
Ako pokrenem 2 detached thread-a koja broje do 10 i ispisuju poruku na STDOUT, sve je u redu. Medjutim, ako stavim sleep() u petlju funkcije koja se izvrsava u thread-u (linija (1)), onda se samo prvi thread izvrsi i petlja u njoj se izvrsi samo jednom. Zasto?

Code:

#include <stdio.h>
#include <pthread.h>


/*
Thread start function, counts to 10 and exits.
*/
void* f(void* arg)
{
  char* param = (char*)arg;
  int i;
  
  for (i = 1; i <= 10; i++)
  {
    printf("\n%s %d", param, i);
    sleep(1);/* (1) */
  }

  return NULL;
}


int main(void)
{
  pthread_attr_t attr1;
  pthread_attr_t attr2;
  pthread_t th1;
  pthread_t th2;
  char arg1[10] = "thread1";
  char arg2[10] = "thread2";
  
  pthread_attr_init(&attr1);
  pthread_attr_init(&attr2);
  pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED);
  pthread_attr_setdetachstate(&attr2, PTHREAD_CREATE_DETACHED);
  pthread_create(&th1, &attr1, &f, arg1);
  pthread_create(&th2, &attr2, &f, arg2);
  
  printf("\n");
  return 0;
}


Sve lepo radi ako koristim joinable threads i pthread_join(), tada nema problema sa pozivom sleep(). Zasto detached thread pravi problem?

Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
..shall-bg.customer.sbb.co.yu.

ICQ: 60630914


+1 Profil

icon Re: sleep() and detached threads28.01.2006. u 12:23 - pre 221 meseci
pa ne bas... zapravo, ni jedan od ova 2 thread-a ti se nece izvrsiti iz prostog razloga zato sto nisi pozvao pthread_exit() i ni jedan od ova thread-a nece uspeti da se izvrsi posto ce mucki umreti sa main()-om. pored toga, trebalo bi da pocistis attr1 i attr2, koji ti u sustini nisu potrebni, jednan pthread_attr_t je sasvim dovoljan u ovom slucaju...

malo prepevano:

Code:

#include <stdio.h>
#include <pthread.h>


/*
Thread start function, counts to 10 and exits.
*/
void* f(void* arg)
{
  char* param = (char*)arg;
  int i;
  
  for (i = 1; i <= 10; i++)
  {
    printf("\n%s %d", param, i);
    sleep(1);/* (1) */
  }

  return NULL;
}


int main(void)
{
  pthread_attr_t attr;
  pthread_t th1;
  pthread_t th2;
  char arg1[10] = "thread1";
  char arg2[10] = "thread2";
  
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  
  pthread_create(&th1, &attr, &f, arg1);
  pthread_create(&th2, &attr, &f, arg2);

  pthread_attr_destroy(&attr);
  
  pthread_exit(NULL);
  return 0;
}


pogledaj malo podrobnije razlike izmedju detached/joinable threads-a i probaj da nadjes bolju literaturu, posto pretpostavljam da si uzeo neki od plutajucih linux-like primera na netu koji su netacni, nepotpuni i lose dokumentovani sa samo povrsnim pregledom razlike izmedju detached/joinable thread-ova. :(

[Ovu poruku je menjao caboom dana 28.01.2006. u 13:25 GMT+1]
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.51.eunet.yu.



+1 Profil

icon Re: sleep() and detached threads28.01.2006. u 15:33 - pre 221 meseci
Ali problem pravi sleep(), ako nema te linije sve lepo radi. Zasto?
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
..shall-bg.customer.sbb.co.yu.

ICQ: 60630914


+1 Profil

icon Re: sleep() and detached threads28.01.2006. u 16:06 - pre 221 meseci
ne, vec ako ne pozoves pthread_exit() ponasanje je sasvim nepredvidivo, u vecini slucajeva nista se nece desiti... pogledaj man za pthread_exit(), a jedinog udela u koji ima sleep() u primeru koji si dao jeste da ti daje dovoljnu latenciju da svemu dodje kraj pre nego sto se oba thread-a izvrse u celosti.
ako ti je ilustrativnije, mozes da probas ovako nesto (while(1); umesto pthread_exit()):

Code:

#include <stdio.h>
#include <pthread.h>


/*
Thread start function, counts to 10 and exits.
*/
void* f(void* arg)
{
  char* param = (char*)arg;
  int i;
  
  for (i = 1; i <= 10; i++)
  {
    printf("\n%s %d", param, i);
    sleep(1);/* (1) */
  }

  return NULL;
}


int main(void)
{
  pthread_attr_t attr;
  pthread_t th1;
  pthread_t th2;
  char arg1[10] = "thread1";
  char arg2[10] = "thread2";
  
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  
  pthread_create(&th1, &attr, &f, arg1);
  pthread_create(&th2, &attr, &f, arg2);

  pthread_attr_destroy(&attr);
  
  /*forget about it... */
  /*pthread_exit(NULL);*/
  
  while(1);

  return 0;
}


trazis problem na pogresnom mestu...

[Ovu poruku je menjao caboom dana 28.01.2006. u 17:07 GMT+1]
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.60.eunet.yu.



+1 Profil

icon Re: sleep() and detached threads30.01.2006. u 21:41 - pre 221 meseci
Ovaj drugi primer mi je pomogao da shvatim.
Hvala.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

[es] :: C/C++ programiranje :: sleep() and detached threads

[ Pregleda: 3060 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.