Два параллельных цикла - C (СИ)
Формулировка задачи:
Приветствую, не могу сообразить, как правильно реализовать систему.
Нужно сделать два цикла, которые должны работать не зависимо друг от друга.При компиляции все в порядке, про выполнение процесс зависает на pTest1(). Подскажите, что я делаю не так?
#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; }
Решение задачи: «Два параллельных цикла»
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; }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с потоками и процессами
- Объявление переменной
run_flag
, которая будет использоваться как флаг завершения работы программы - Определение двух функций
pTest1
иpTest2
, которые будут выполняться в отдельных потоках - Создание двух потоков
tid1
иtid2
, которые будут выполнять функцииpTest1
иpTest2
соответственно - Ожидание 5 секунд, чтобы оба потока успели запуститься и начать выполнение своих функций
- Установка значения переменной
run_flag
в 0, чтобы остановить выполнение функций в обоих потоках - Ожидание завершения выполнения потока
tid1
с помощью функцииpthread_join
- Ожидание завершения выполнения потока
tid2
с помощью функцииpthread_join
- Вывод сообщения
--> DONE
, чтобы указать на завершение работы программы - Возврат значения 0, что означает успешное выполнение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д