Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
#1

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

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

Почему потоки выполняются один за другим?

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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2016, 08:37     Потоки не выполняются параллельно
Посмотрите здесь:

Какие конструкции C++ выполняются не там, где написаны? C++
C++ Циклы if-else внутри do-while не выполняются
C++ Стоит ли учить С++ параллельно с С#?
C++ Неправильно выполняются мат операции
Заполнить массив параллельно побочной диагонали C++
Не выполняются функции из отдельных файлов C++
Заполнить массив параллельно побочной диагонали C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valeryn
41 / 25 / 5
Регистрация: 17.05.2015
Сообщений: 163
15.06.2016, 08:47     Потоки не выполняются параллельно #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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();
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
15.06.2016, 11:06  [ТС]     Потоки не выполняются параллельно #3
А чем отличается этот код?
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
15.06.2016, 11:20     Потоки не выполняются параллельно #4
Knjagskij, ты книжку-то читал? join() вернёт управление только когда соответсвующий поток завершится.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
15.06.2016, 11:24  [ТС]     Потоки не выполняются параллельно #5
Почему тогда второй вариант не работает так же как и первый? Ведь он после t1.join() возвращает управление main и запускает поток t2.
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
15.06.2016, 11:27     Потоки не выполняются параллельно #6
В твоём варианте второй поток создаётся только по завершении первого, благодаря join().
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
15.06.2016, 11:45  [ТС]     Потоки не выполняются параллельно #7
А почему важно время создания? Ведь, по идее, должно быть важно только время запуска.
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
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() вернёт управление, т. е. когда первый поток завершится.
Ты сам сделал так, что потоки не существуют одновременно.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
15.06.2016, 12:18  [ТС]     Потоки не выполняются параллельно #9
А что меняется во втором случае?
Ведь, выполнение потоков должно зависеть от join(), а не времени их создания
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
15.06.2016, 12:22     Потоки не выполняются параллельно #10
Knjagskij, я тебе уже объяснил, что второй поток не создаётся, пока не стартует и не завершится первый. join() не возвращает управление, и те строчки просто не выполняются.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
15.06.2016, 13:34  [ТС]     Потоки не выполняются параллельно #11
Цитата Сообщение от Valeryn Посмотреть сообщение
* * thread t1(proc1, 5);
* * thread t2(proc2, 7);
* * t1.join();
* * t2.join();
Почему тогда здесь создается? join() же не возвращает управление
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,049
Завершенные тесты: 1
15.06.2016, 14:16     Потоки не выполняются параллельно #12
Цитата Сообщение от Knjagskij Посмотреть сообщение
Почему тогда здесь создается? join() же не возвращает управление
восприми join как подождать пока закончится поток

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

стартуем первый поток
ждем пока кончится первый поток
стартуем второй
ждем, пока закончится второй
Valeryn
41 / 25 / 5
Регистрация: 17.05.2015
Сообщений: 163
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 завершиться до того, как создадим второй поток.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
16.06.2016, 11:04  [ТС]     Потоки не выполняются параллельно #14
Может быть такая ситуация, когда поток-родитель завершится до выполнения *.join()?
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
16.06.2016, 11:07     Потоки не выполняются параллельно #15
Нет. join() как раз и не даёт ему завершиться раньше.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
16.06.2016, 11:13  [ТС]     Потоки не выполняются параллельно #16
Получается, что главный поток работает, потом при создании автоматически запускается второй поток, а join() вызывается из главного потока, т.е. мы управляем дочерним потоком из главного?
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
16.06.2016, 11:16     Потоки не выполняются параллельно #17
join() просто ждёт пока вторичный поток отработает и не возвращает управление, не давая порождающему потоку выполняться дальше, в том числе не даёт ему завершиться раньше вторичного.
Ну если ты вставишь return, например, до вызова join(), то ясно, что он завершится раньше принудительно.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
16.06.2016, 11:54  [ТС]     Потоки не выполняются параллельно #18
Я имел ввиду, может ли процесс-родитель завершится в промежуток времени между стартом нового процесса и join()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2016, 11:57     Потоки не выполняются параллельно
Еще ссылки по теме:

C++ Что такое потоки ввода, потоки вывода?
C++ Не выполняются программы на C++
Не выполняются действия плагина C++
Не выполняются все функции C++
C++ Функции внутри цикла не выполняются

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

Или воспользуйтесь поиском по форуму:
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
16.06.2016, 11:57     Потоки не выполняются параллельно #19
Только если программист криворукий или произошла какая-то ошибка.
Твой вопрос примерно так звучит: может ли программа прерваться неожиданно в каком-то месте.
Yandex
Объявления
16.06.2016, 11:57     Потоки не выполняются параллельно
Ответ Создать тему
Опции темы

Текущее время: 06:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru