LINUX.ORG.RU

снова нити


0

0

недавно была темка про посикс нити, переподниму.

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

void *t1()
{
 printf("t1 was called!\n");
}

int main(int argc, char **argv)
{
 pthread_t pt1;
 if(pthread_create(&pt1, NULL, t1, NULL))
 {
  pthread_detach(pt1);
  printf("pthread_create failed\n");
 } 
 printf("main\n");
 return(0);
}

и по идее должен напечатать обе месаги, но в нить t1 он заходит если повезет только через раз, а то и с десятого запуска! чего ж ему ненравится то?
anonymous

Re: снова нити

забыл сказать
gcc-4.1 -Wall c.c -o c -lpthread

anonymous ()

Re: снова нити

Банально не успевает?

dissident ()
Ответ на: Re: снова нити от dissident

Re: снова нити

да join еcли вломить, то ждет. а если десять нитей и логично, что ждать каждую ненадо, что тогда.. или там в ните не просто
принтф, а в бесконечном цикле, тоже неподождешь.. как будто прерывается раньше времени из-за какогото события.. в конечном итоге хотелось бы иметь с десяток нитей простых и одну в бесконечном цикле которую потом по pthread_kill убить.. может кто-нибудь набросает пару строк работающих^^ 

void *t1() {
  for(;;) printf("t1 was called!\n");
}

void *t2() {
  printf("t2 was called!\n");
}

int main() {
 ...
 pthread_create(&pt1, NULL, t1, NULL);

 for(..10..) if(pthread_create(&pt2, NULL, t2, NULL));

 pthread_kill(pt1, SIGKILL);

anonymous ()

Re: снова нити

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

pthread_t pt1;
void *end;

void t1( void ) {
   printf("t1 was called!\n");
   pthread_exit( &end );
}
 
int main(int argc, char **argv) {


if( pthread_create(&pt1, NULL, &t1, NULL) == 0 ) {
   printf("pthread_create good\n");
   pthread_join( pt1, &end );
} else {
   printf( "pthread: error %s\n", strerror( errno ));
}


printf("main\n");

return(0);
}



Ради расширения кругозора рекомендую посмотреть системный вызов ядра sys_clone()

yantux ()
Ответ на: Re: снова нити от anonymous

Re: снова нити

pthread_kill лучше не использовать,

просто завести переменную которую будет проверять в этом бесконечном цикле, если выставлена то выходим.

fghj ★★★★★ ()

Re: снова нити

блин, переформулирую) а то что-то и сам уже запутался) вот код __

void *t1(void *ptr)
{
 //...
 //здесь что-то якобы выполнилось успешно
 printf("smth well done!\n");
}

void *t2(void *ptr)
{
 for(;;)
 {
   //вот здесь какая-нить то проверка как оно выполнилось
 }
}

int main(int argc, char **argv)
{
 pthread_t pt1[10];
 pthread_t pt2;
 
 if(pthread_create(&pt2, NULL, t2, (void *)&someinfo))
 {
  pthread_detach(pt2);
  printf("pthread_create failed\n");
 }

 for(x = 0; x < 10; x++)
 {
  if(pthread_create(&pt1[x], NULL, t1, (void *)&someinfo)
  {
    pthread_detach(pt1);
    printf("pthread_create failed\n");
  }
  pthread_join(pt1, NULL);
 }

 //здесь по условию муки закончатся
 return(0);
}

т.е. вломили 10 нитей они чего-то сделали и вывели месаги на экран что сделали - их (месаги) видно. а бесконечная нить должна сидеть и проверять как хорошо они выполнили (так ненужно следить за маркерами выполнения, просто постоянно проверяет). так будет работать? если я в цикле printf, то те десять потоков так и не запустятся, я так понимаю что из-за принтфа..

anonymous ()
Ответ на: Re: снова нити от anonymous

Re: снова нити

Перед циклом поставь sleep()

Для pthread_join(pt1, NULL); нужен свой цикл для перебора массива указателей pt1

У pthread_detach(pt1); тоже должно быть &pt1[x]

yantux ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.