Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 27
1

Пинг-понг потоками

10.04.2020, 23:41. Просмотров 1660. Ответов 13
Метки нет (Все метки)


Ребят,всм привет!
Пытаюсь вникнуть в многопоточное программирование.Хочу сделать простую программу,чтобы было 2 потока, которые пишут в консоль поочередно пинг - понг и так бесконечно и строго друг за другом.Помогите разобраться в синхронизации.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2020, 23:41
Ответы с готовыми решениями:

Игра пинг-понг: отрисовка происходит там, где не должна
Написал отрисовку кадра в консоль и управление объектами. Начал тестировать многопоточность и в...

Сетевая программа по принципу "Пинг-понг"
Здравствуйте. Хочу написать программу по типу "Пинг-понг": я оправляю со стационара свой айпи на...

"Пинг-понг", нужно исправить ошибки
#include <vcl.h> #pragma hdrstop #include "Unit1.h"...

Пинг-понг
Приветствую. Как сделать так, чтобы шарик нормально рисовался и красная платформа при движении в...

13
Эксперт С++
8394 / 3934 / 859
Регистрация: 15.11.2014
Сообщений: 8,882
10.04.2020, 23:47 2
Цитата Сообщение от Alemao1988 Посмотреть сообщение
Пытаюсь вникнуть в многопоточное
Цитата Сообщение от Alemao1988 Посмотреть сообщение
строго друг за другом
начни своё вникание с осознания того, зачем вообще нужна многопоточность.

многопоточный - значит исполняющийся парралельно.
если тебе нужно "строго друг за другом", значит тебе не нужна многопоточность.
1
6402 / 4299 / 1739
Регистрация: 07.05.2019
Сообщений: 13,120
Записей в блоге: 1
11.04.2020, 10:47 3
Цитата Сообщение от Alemao1988 Посмотреть сообщение
Пытаюсь вникнуть в многопоточное программирование.Хочу сделать простую программу,чтобы было 2 потока, которые пишут в консоль поочередно пинг - понг и так бесконечно и строго друг за другом.Помогите разобраться в синхронизации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
std::mutex mx;
bool ping = true;
volatile bool stop = false;
 
std::vector<std::thread> threads;
for (size_t i = 0; i < 2; ++i)
    threads.emplace_back([&mx, &ping, &stop]()
    {
        while (!stop)
        {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::lock_guard lock(mx);
            std::cout << std::this_thread::get_id() << ": " << (ping? "PING": "PONG") << std::endl;
            ping = !ping;
            //std::this_thread::sleep_for(std::chrono::seconds(1));
        }
    });
 
 
_getch();
stop = true;
for (auto &thread: threads)
    thread.join();
Кстати, неожиданно для меня получилось, что если в этом коде убрать первый sleep_for и раскоментарить второй, то возникнет resource starvation, т.е. всегда будет работать только один поток, второй ждёт пока освободится мьютекс.
Я почему-то думал, что у мьютекса есть какая-то очередь блокировок, а выглядит так, будто он работает как spin-lock (проверил на InitializeCriticalSection - то же самое)
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 27
11.04.2020, 11:07  [ТС] 4
Класс,спасибо.
А не могли бы вы прокомментировать строчку

threads.emplace_back([&mx, &ping, &stop]()

а именно передачу аргументов конструктору thread при создании объекта в векторе.
0
6402 / 4299 / 1739
Регистрация: 07.05.2019
Сообщений: 13,120
Записей в блоге: 1
11.04.2020, 11:11 5
Цитата Сообщение от Alemao1988 Посмотреть сообщение
а именно передачу аргументов конструктору thread при создании объекта в векторе.
Это обычная lambda-функция
https://en.cppreference.com/w/cpp/language/lambda
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 27
11.04.2020, 11:22  [ТС] 6
Понял,с ними я не знаком еще.
Спасибо огромное,изучу.
0
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
11.04.2020, 11:31 7
oleg-m1973, у mutex нет очереди. Эту тему обсуждали уже.
И как писали выше, потоки тут вообще не нужны.
0
6402 / 4299 / 1739
Регистрация: 07.05.2019
Сообщений: 13,120
Записей в блоге: 1
11.04.2020, 11:37 8
Цитата Сообщение от nmcf Посмотреть сообщение
И как писали выше, потоки тут вообще не нужны.
Вопрос вроде был не о том, что нужно/ненужно - а как решить такую задачу в потоках. Для обучения вполне нормальная задача.
0
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
11.04.2020, 11:43 9
И чему она обучает? Использовать потоки в непараллельном режиме?
Их будет сложно синхронизировать. Одним mutex не обойдёшься.
0
6402 / 4299 / 1739
Регистрация: 07.05.2019
Сообщений: 13,120
Записей в блоге: 1
11.04.2020, 11:45 10
Цитата Сообщение от nmcf Посмотреть сообщение
И чему она обучает? Использовать потоки в непараллельном режиме?
Синхронизации потоков.
Вот ping-pong в цикле точно ничему не обучает.
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 27
11.04.2020, 16:56  [ТС] 11
А у меня еще тогда такой вопрос.В качестве аргумента в метод emplace_back мы должны передать объект потока.Но там стоит лямбда-функция.Получается происходит неявное преобразование в объект потока?Но я думал,что конструктор thread объявлен explicit?

То есть не очень понимаю как из лямбды получается объект потока,который добавляем в вектор?Что лямбда описывает действие в потоке - поятно.

Спасибо.
0
6402 / 4299 / 1739
Регистрация: 07.05.2019
Сообщений: 13,120
Записей в блоге: 1
11.04.2020, 17:00 12
Лучший ответ Сообщение было отмечено Alemao1988 как решение

Решение

Цитата Сообщение от Alemao1988 Посмотреть сообщение
А у меня еще тогда такой вопрос.В качестве аргумента в метод emplace_back мы должны передать объект потока.Но там стоит лямбда-функция.Получается происходит неявное преобразование в объект потока?Но я думал,что конструктор thread объявлен explicit?
В emplace_back передаётся не объект, а параметры конструктора. Он сам потом вызывает конструктор объекта с этими параметрами.
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 27
11.04.2020, 17:17  [ТС] 13
Понял,спасибо большое!
0
6402 / 4299 / 1739
Регистрация: 07.05.2019
Сообщений: 13,120
Записей в блоге: 1
11.04.2020, 20:39 14
Цитата Сообщение от nmcf Посмотреть сообщение
oleg-m1973, у mutex нет очереди. Эту тему обсуждали уже.
Нашёл, откуда я взял эту очередь в мьютексе
https://en.cppreference.com/w/... notify_one
However, some implementations (in particular many implementations of pthreads) recognize this situation and avoid this "hurry up and wait" scenario by transferring the waiting thread from the condition variable's queue directly to the queue of the mutex within the notify call, without waking it up.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2020, 20:39

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Пинг Понг в C#
Кто знает как сделать пинг понг в C#

Пинг-понг
ребята Help please1 Надо сделать пинг-понг, вроде все более-менее вот тока отбивание от реек чере...

Пинг-понг
? есть ниже в коде комментарием unit tennis; interface uses

Пинг-понг в excel
Требуется написать код для игры пинг-понг в excel. Пожалуйста, подсобите, очень надо. Сам &quot;пенёк&quot; в...

Пинг-понг на Tkinter
Здравсвуйте, видел в интернете много вариантов пинг понга с ракетками по бокам. Хотел сделать...

Игра пинг-понг
Ребят, помогите пожалуйста описать каждую строку в программе или хотя бы основные строки буду...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.