nixp.ru v3.0

21 января 2017,
суббота,
18:37:43 MSK

Аутсорсинг Linux с компанией «Флант»
Аватар пользователя unkier
unkier написал 17 января 2005 года в 15:50 (682 просмотра) Ведет себя неопределенно; открыл 12 тем в форуме, оставил 22 комментария на сайте.

такая программулька:

#include

#include

#include

void *myroutine(void *arg)

{

int i;

for(i=0;i<10;i++) printf(«thread\n»);

return arg;

}

int main()

{

pthread_t thread;

pthread_attr_t attr;

int j;

printf(«main start\n»);

pthread_attr_init(&attr);

pthread_create (&thread, &attr, myroutine, NULL);

for(j=0;j<10;j++)

{

printf(«main\n»);

}

//sleep(1);

printf(«main end\n»);

return EXIT_SUCCESS;

}

компилим : gcc -o main main.c -lpthread

и получаем что работает только главный цыкл, цикл в порожденном потоке неразу не выполняется…

если раскоментировать sleep то порожденный поток благополучно отрабатывает…

вопрос:

это нормально ? это всегда так ? это нельзя изменить ?

тоесть если я наражал потоков и гдето у меня какието циклы и т д , потоки вообще работать не будут никогда ?

обьясните мне дураку

я пробовал fork делать, тогда отрабатывает сначало дочерний потом основной поток, без всяких слипов…

в чём правда ?

Fatal

функция main() померает и уносит за собой потоки. действия потоков отличаются в зависимости от ОС.

можно подождать, когда он(они) закончит свою работу. для этого существует следующая функция

int pthread_join(pthread_t thread, void **value_ptr)

Causes the calling thread to wait for the termination of the specified thread.

вырезка из man

Fatal
unkier
я пробовал fork делать, тогда отрабатывает сначало дочерний потом основной поток, без всяких слипов…

на это не стоит полагаться, так как это может быть не всегда, что fork() начнёт работать первым.

а потоки не всегда могут работать паралельно, в разных UNIX, UNIX-like по-разному, в Linux потоки работают паралельно.

смотри pthread_setconcurrency(), насколько мне помниться в Linux нет её описания, может я ошибаюсь.

unkier

всё понял !! сам дурак оказался :)

про pthread_join это да, если поток создан как JOINABLE его надо дождаться (pthread_join),

если как DETACHED то ждать ненадо…

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

просто главный процесс видать быстренько отрабатывал, а а дочерний даже начинать неуспевал…

Fatal спасибо навёл на мысль :)

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.