Два параллельных цикла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Приветствую, не могу сообразить, как правильно реализовать систему. Нужно сделать два цикла, которые должны работать не зависимо друг от друга.
#include 
#include 
 
void *pTest1()
{ 
  while(1)
  {
    printf("--> pTest1\n");
    sleep(5);
  }
  return NULL;
}
 
void *pTest2()
{  
  while(1)
  {
    printf("--> pTest2\n");
    sleep(5);
  }
  return NULL;
}
 
int main()
{
  pthread_t tid;
  pthread_create(&tid, NULL, pTest1(), NULL);
  pthread_create(&tid, NULL, pTest2(), NULL);
 
  printf("--> DONE\n");
  pthread_exit(0);
 
  return 0;
}
При компиляции все в порядке, про выполнение процесс зависает на pTest1(). Подскажите, что я делаю не так?

Решение задачи: «Два параллельных цикла»

textual
Листинг программы
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
 
int run_flag=1;
 
//не [void *func] а [void* func], то есть не указатель на функцию, возвращающую void, а функция, возвращающая void*, то есть привести обозначение к реальности (компилятору-то без разницы)
void* pTest1(){ 
  while(run_flag){ //флаг завершения
    printf("--> pTest1\n");
    usleep(400000); //так нагляднее видно одновременное выполнение
  }
  return NULL;
}
 
void* pTest2(){  
  while(run_flag){
    printf("--> pTest2\n");
    sleep(1);
  }
  return NULL;
}
 
int main(){
  pthread_t tid1, tid2; //идентификаторы потоков
  pthread_create(&tid1, NULL, pTest1, NULL); //передаем адрес функции, а не результат выполнения
  pthread_create(&tid2, NULL, pTest2, NULL);
  sleep(5);
  run_flag=0; //флаг завершения
  pthread_join(tid1, NULL);
  pthread_join(tid2, NULL);
  printf("--> DONE\n");
  return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с потоками и процессами
  2. Объявление переменной run_flag, которая будет использоваться как флаг завершения работы программы
  3. Определение двух функций pTest1 и pTest2, которые будут выполняться в отдельных потоках
  4. Создание двух потоков tid1 и tid2, которые будут выполнять функции pTest1 и pTest2 соответственно
  5. Ожидание 5 секунд, чтобы оба потока успели запуститься и начать выполнение своих функций
  6. Установка значения переменной run_flag в 0, чтобы остановить выполнение функций в обоих потоках
  7. Ожидание завершения выполнения потока tid1 с помощью функции pthread_join
  8. Ожидание завершения выполнения потока tid2 с помощью функции pthread_join
  9. Вывод сообщения --> DONE, чтобы указать на завершение работы программы
  10. Возврат значения 0, что означает успешное выполнение программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы