[ karas @ 27.01.2006. 23:58 ] @
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?
[ caboom @ 28.01.2006. 12:23 ] @
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]
[ karas @ 28.01.2006. 15:33 ] @
Ali problem pravi sleep(), ako nema te linije sve lepo radi. Zasto?
[ caboom @ 28.01.2006. 16:06 ] @
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]
[ karas @ 30.01.2006. 21:41 ] @
Ovaj drugi primer mi je pomogao da shvatim.
Hvala.