Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
1

Потоки не выполняются параллельно

15.06.2016, 08:37. Показов 2894. Ответов 18
Метки нет (Все метки)

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
35
36
37
using namespace std;
 
void proc1(const int num)
{
    int max_i = 50000;
    int i = 0;
    while(i<max_i)
    {
        cout << std::to_string(num);
        ++i;
    }
}
 
void proc2(const int num)
{
    int max_i = 50000;
    int i = 0;
    while(i<max_i)
    {
        cout << std::to_string(num);
        ++i;
    }
}
 
int main()
{
   // My m;
   // qDebug() << m.retFunc();
 
    thread t1(proc1, 5);
    t1.join();
 
    thread t2(proc2, 7);
    t2.join();
 
    return 0;
}
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2016, 08:37
Ответы с готовыми решениями:

Потоки осуществляющие сравнение фраз параллельно по словам
Охранное агентство разработало новую систему управления электронными замками. Для открытия двери...

AsyncTask doInbackground и onPostExecute выполняются параллельно ?
Привет всем)) колдую на AsyncTask doInBackground и onPostExecute Читал что onPostExecute...

Потоки выполняются не асинхронно
Здравствуйте, пытаюсь написать алгоритм обедающих философов, вкратце нужно запустить несколько...

Многопоточность. Потоки выполняются по очереди
Написал простую программу, для наглядности многопоточности. package com.company; class MyThread...

18
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
15.06.2016, 08:47 2
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

Цитата Сообщение от Knjagskij Посмотреть сообщение
thread t1(proc1, 5); t1.join(); thread t2(proc2, 7); t2.join();
тут ошибка.
C++
1
2
3
4
    thread t1(proc1, 5);
    thread t2(proc2, 7);
    t1.join();
    t2.join();
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
15.06.2016, 11:06  [ТС] 3
А чем отличается этот код?
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.06.2016, 11:20 4
Knjagskij, ты книжку-то читал? join() вернёт управление только когда соответсвующий поток завершится.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
15.06.2016, 11:24  [ТС] 5
Почему тогда второй вариант не работает так же как и первый? Ведь он после t1.join() возвращает управление main и запускает поток t2.
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.06.2016, 11:27 6
В твоём варианте второй поток создаётся только по завершении первого, благодаря join().
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
15.06.2016, 11:45  [ТС] 7
А почему важно время создания? Ведь, по идее, должно быть важно только время запуска.
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.06.2016, 11:54 8
Какого запуска?
C++
1
2
3
4
5
    thread t1(proc1, 5);
    t1.join();
 
    thread t2(proc2, 7);
    t2.join();
4-я и последующие строки выполнятся, только когда первый join() вернёт управление, т. е. когда первый поток завершится.
Ты сам сделал так, что потоки не существуют одновременно.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
15.06.2016, 12:18  [ТС] 9
А что меняется во втором случае?
Ведь, выполнение потоков должно зависеть от join(), а не времени их создания
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.06.2016, 12:22 10
Knjagskij, я тебе уже объяснил, что второй поток не создаётся, пока не стартует и не завершится первый. join() не возвращает управление, и те строчки просто не выполняются.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
15.06.2016, 13:34  [ТС] 11
Цитата Сообщение от Valeryn Посмотреть сообщение
* * thread t1(proc1, 5);
* * thread t2(proc2, 7);
* * t1.join();
* * t2.join();
Почему тогда здесь создается? join() же не возвращает управление
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
15.06.2016, 14:16 12
Цитата Сообщение от Knjagskij Посмотреть сообщение
Почему тогда здесь создается? join() же не возвращает управление
восприми join как подождать пока закончится поток

у тебя получается так:

стартуем первый поток
ждем пока кончится первый поток
стартуем второй
ждем, пока закончится второй
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
16.06.2016, 02:15 13
Цитата Сообщение от Knjagskij Посмотреть сообщение
Почему тогда здесь создается? join() же не возвращает управление
Ну не тупим.
C++
1
2
3
4
    thread t1(proc1, 5); //создаем поток t1 и запускаем его.
    thread t2(proc2, 7); //создаем поток t2 и запускаем его
    t1.join(); //ждем, пока поток t1 завершиться
    t2.join(); //ждем, пока поток t2 завершиться
У тебя же, мы ждем, пока поток t1 завершиться до того, как создадим второй поток.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
16.06.2016, 11:04  [ТС] 14
Может быть такая ситуация, когда поток-родитель завершится до выполнения *.join()?
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
16.06.2016, 11:07 15
Нет. join() как раз и не даёт ему завершиться раньше.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
16.06.2016, 11:13  [ТС] 16
Получается, что главный поток работает, потом при создании автоматически запускается второй поток, а join() вызывается из главного потока, т.е. мы управляем дочерним потоком из главного?
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
16.06.2016, 11:16 17
join() просто ждёт пока вторичный поток отработает и не возвращает управление, не давая порождающему потоку выполняться дальше, в том числе не даёт ему завершиться раньше вторичного.
Ну если ты вставишь return, например, до вызова join(), то ясно, что он завершится раньше принудительно.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
16.06.2016, 11:54  [ТС] 18
Я имел ввиду, может ли процесс-родитель завершится в промежуток времени между стартом нового процесса и join()
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
16.06.2016, 11:57 19
Только если программист криворукий или произошла какая-то ошибка.
Твой вопрос примерно так звучит: может ли программа прерваться неожиданно в каком-то месте.
0
16.06.2016, 11:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2016, 11:57
Помогаю со студенческими работами здесь

Потоки не работают параллельно
Написал я такой кусок кода (все это внутри класса MainActivity): class CalcFiveSecClass...

Как сделать, чтобы потоки выполнялись параллельно?
у меня есть 6 потоков, но как мне сделать чтобы они шли параллельно ? static void Main(string...

Потоки ставятся в очередь, а не идут параллельно, объясните, пожалуйста
Добрый день, коллеги, разъясните, пожалуйста, наверняка простую ситуацию. Задача стоит в том, чтобы...

[XP] Некоторые скрипты выполняются из строки и не выполняются из файла без вывода ошибки
mode con cp select=65001&gt;nul&amp;cd.&gt;ßä ::или ! 2&gt;nul&amp;@cls&amp;&gt;nul chcp 65001&amp;cd.&gt;öüотсюда net user...

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода,...

Байтовые потоки и потоки символов
Объясните, пожалуйста подробно что имелось ввиду На самом низком уровне все операции ввода/вывода...


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

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