Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 4 odgovora
  • 4.010 pregleda

Najnovija ↓

sleep() and detached threads 28.01.2006. u 00:58 · pre 252 meseca #1
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?
Potpis
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."
Re: sleep() and detached threads 28.01.2006. u 13:23 · pre 252 meseca
izmenjeno 1 put, poslednji put caboom 28.01.2006. u 13:25
  1. caboom28.01.2006. u 13:25zapis iz teksta poruke
#2
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. :(
Potpis
OV SM
LA PK
Re: sleep() and detached threads 28.01.2006. u 16:33 · pre 252 meseca #3
Ali problem pravi sleep(), ako nema te linije sve lepo radi. Zasto?
Potpis
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."
Re: sleep() and detached threads 28.01.2006. u 17:06 · pre 252 meseca
izmenjeno 1 put, poslednji put caboom 28.01.2006. u 17:07
  1. caboom28.01.2006. u 17:07zapis iz teksta poruke
#4
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...
Potpis
OV SM
LA PK
Re: sleep() and detached threads 30.01.2006. u 22:41 · pre 252 meseca #5
Ovaj drugi primer mi je pomogao da shvatim.
Hvala.
Potpis
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."
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme