такая программулька:
#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 делать, тогда отрабатывает сначало дочерний потом основной поток, без всяких слипов…
в чём правда ?
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
функция main() померает и уносит за собой потоки. действия потоков отличаются в зависимости от ОС.
можно подождать, когда он(они) закончит свою работу. для этого существует следующая функция
int pthread_join(pthread_t thread, void **value_ptr)
Causes the calling thread to wait for the termination of the specified thread.
вырезка из man
на это не стоит полагаться, так как это может быть не всегда, что fork() начнёт работать первым.
а потоки не всегда могут работать паралельно, в разных UNIX, UNIX-like по-разному, в Linux потоки работают паралельно.
смотри pthread_setconcurrency(), насколько мне помниться в Linux нет её описания, может я ошибаюсь.
всё понял !! сам дурак оказался :)
про pthread_join это да, если поток создан как JOINABLE его надо дождаться (pthread_join),
если как DETACHED то ждать ненадо…
но не в этом суть, просто если циклы поставить 100000 становиться видно на глаз что работают оба процесса:)
просто главный процесс видать быстренько отрабатывал, а а дочерний даже начинать неуспевал…
Fatal спасибо навёл на мысль :)