С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 08.10.2017
Сообщений: 7
1

Два параллельных цикла

17.04.2018, 10:59. Показов 1585. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую, не могу сообразить, как правильно реализовать систему.
Нужно сделать два цикла, которые должны работать не зависимо друг от друга.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <pthread.h>
 
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(). Подскажите, что я делаю не так?
0
Лучшие ответы (1)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Блог
17.04.2018, 10:59
Ответы с готовыми решениями:

Два параллельных окна
Абстрактно говоря, задача состоит в следующем: есть окно1, в которое юзер вводит некоторый текст...

Два параллельных Cursor
Вообщем стоит следующая задача: Все дело происходит в хранимке. необходимо пройтись по двум...

Два параллельных зеркала
Два параллельных зеркала А и В обращены друг к другу. При падении луча на зеркало А он ослабляется...

Два длинных параллельных проводника
Два длинных параллельных проводника, находящиеся на расстоянии d друг от друга, соединены с одного...

4
Эксперт CЭксперт С++
5118 / 4558 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
17.04.2018, 11:11 2
andreyddk, попробуйте сделать так:
C
1
2
3
  pthread_t tid1, tid2;
  pthread_create(&tid1, NULL, pTest1(), NULL);
  pthread_create(&tid2, NULL, pTest2(), NULL);
0
0 / 0 / 0
Регистрация: 08.10.2017
Сообщений: 7
17.04.2018, 11:15  [ТС] 3
Тоже самое.
0
4019 / 2565 / 430
Регистрация: 09.09.2017
Сообщений: 11,443
17.04.2018, 11:21 4
Лучший ответ Сообщение было отмечено andreyddk как решение

Решение

Цитата Сообщение от andreyddk Посмотреть сообщение
sleep(5);
Ошибка: не подключено <unistd.h>
Цитата Сообщение от andreyddk Посмотреть сообщение
pthread_create(&tid, NULL, pTest1(), NULL);
pthread_create(&tid, NULL, pTest2(), NULL);
Ошибка: сохраняете идентификаторы потоков в одну и ту же переменную. Как их потом отлавливать? У вас-то этого нет, а должно быть.
Цитата Сообщение от andreyddk Посмотреть сообщение
void *pTest1() {
while(1)
Нет способа завершения потока. Хотя бы общую переменную введите!
Цитата Сообщение от andreyddk Посмотреть сообщение
pthread_create(&tid, NULL, pTest1(), NULL);
Ошибка: в качестве указателя на функцию передаете результат ее вызова, а не адрес.
Надо примерно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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
0 / 0 / 0
Регистрация: 08.10.2017
Сообщений: 7
17.04.2018, 14:59  [ТС] 5
COKPOWEHEU, Благодарю, все по полочкам разложили.
Есть еще один вопрос. Тестировал код на личной машине. Arch linux, qt creator все работает отлично, переношу код на виртуальную машину debian 9 и второй поток pTest2() не запускается. В чем может быть проблема?
0
17.04.2018, 14:59
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
17.04.2018, 14:59
Помогаю со студенческими работами здесь

Как запустить два параллельных процесса в Pascal?
Т.е. два куска кода должны выполнятся одновременно, при чем в ходе выполнения второго процесса...

Составьте программу, определяющую, учатся ли два школьника в параллельных классах
Помогите, пожалуйста. Составьте программу, определяющую, учатся ли два школьника в параллельных...

Как написать программу печатающую чётные и нечётные трёхзначные в два параллельных столбца?
Напишите пожалуйста программу проверяющую чётность трёхзначных чисел и печатающую чётные и нечётные...

Два шара подвешены на параллельных нитях одинаковой длины так, что они соприкасаются
Два шара подвешены на параллельных нитях одинаковой длины так, что они соприкасаются. Масса...

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

Сделать два одномерных массива из средних арифметических значений на каждой диагонали матрицы, параллельных главной диагонали
Задачка по процедурам.. Из двумерных массивах A и В сделать два одномерных массива из средних...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru