Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690

Как правильно реализовывается многопоточность

05.12.2014, 16:33. Показов 2744. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Стоит задача создать несколько потоков, которые будут выполнять какие-то действия.
У Шлее (профессиональное программирование на C++) по этой теме написано крайне мало(на мой взгляд), буквально 30 страниц.

Не по теме:

Возможно книга рассчитана не на новичков (судя по названию, то скорее всего так оно и есть ^_^)


В статьях по этой теме тоже не совсем все понятно расписано (например, тут: http://habrahabr.ru/post/182610/).

Не по теме:

Либо это действительно не так сложно сделать, либо это слишком сложно сделать и поэтому необходимо читать книги конкретно про многопоточность ^_^



Теперь более конкретные вопросы:
1. В книге написано, что создавать свой поток надо так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Mythread : public QThread {
public:
    void run() {
         // some code
    }
}
 
int main() {
    Mythread thread;
    thread.start();
    return 0;
}
В статье, что так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <thread>
 
void threadFunction()
{
     // do smth
}
 
int main()
{
     std::thread thr(threadFunction);
     thr.join();
     return 0;
}
Если ли разница и как правильней? Особенно интересует случай, в котором я создаю приложение с визуальным интерфейсом.

2.
Допустим, у меня есть класс:
C++
1
2
3
4
5
6
7
8
class A {
private:
    // some code
public:
    //some code
    void add(int);
    int get_int();
}
и я хочу, чтобы эти 2 метода выполнялись в своих потоках. Если взять за основу реализацию, показанную в книге Шлее, то в методе run() мне надо написать вызов нужного мне метода или как-то по-другому?
Если же я хочу сделать это также, как написано в статье, то как мне передать параметр в функцию, которая должна выполняться в потоке? Или я могу написать так:
C++
1
 std::thread thr(add(int));
?



Заранее большое спасибо за помощь!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.12.2014, 16:33
Ответы с готовыми решениями:

Почему не реализовывается список?
Пытаюсь для начала создать список из 2-ух элементов, но не получается :( #include &quot;stdafx.h&quot; #include...

Многопоточность, как правильно передавать параметры?
#include &quot;lcbot.h&quot; #include &quot;game.h&quot; #include &lt;windows.h&gt; #include &lt;process.h&gt; #include &lt;stdio.h&gt; game Game; ...

Как правильно организовать многопоточность?
Всем привет! Если кратко Мне нужно организовать выполнение одной большой не цикловой задачи в отдельном потоке. При этом нужно 1....

27
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
05.12.2014, 16:41
Оба метода верные, но первый это создание потоков в кьюте. Второй средствами стандартной библиотеки С++. Выбирайте сами, что вам больше подходит.
1
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.12.2014, 16:57  [ТС]
Ilot, Спасибо, с этим теперь понятно.
А насчет 2-ого вопроса получается, что все-таки надо писать код(или просто вызов нужной мне функции?) в методе run(), который должен выполняться? Это если способом создания потоков в Qt.
И для каждой функции свой поток должен быть?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
05.12.2014, 17:01
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
И для каждой функции свой поток должен быть?
Обязательно. Если конечно вы не собираетесь организовывать пул потоков.
1
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.12.2014, 17:04  [ТС]
Ilot, Спасибо еще раз!
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.12.2014, 17:06
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Либо это действительно не так сложно сделать, либо это слишком сложно сделать и поэтому необходимо читать книги конкретно про многопоточность ^_^
Читать отдельно
C++ Concurrency in Action - Anthony Williams
1
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.12.2014, 17:09  [ТС]
MrGluck, за книгу отдельное спасибо!
Буду изучать ее
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
05.12.2014, 17:12
На самом деле эта книга не для новичков. Я бы рекомендовал для начала ознакомиться с многопоточностью у Джоссатиса Стандарная библиотека С++(второе изд.)
1
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.12.2014, 17:21  [ТС]
Ilot, Да, пожалуй, для начала было бы мне неплохо разобраться с этой темой, читая книгу на русском ^_^
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
05.12.2014, 18:38
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Да, пожалуй, для начала было бы мне неплохо разобраться с этой темой, читая книгу на русском ^_^
Первая книга тоже есть на русском (правда в отвратительном переплете). Русское название: "Параллельное программирование на С++ в действии. Практика разработки многопоточных программ"
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,034
Записей в блоге: 1
05.12.2014, 18:40
DrOffset, как думаете, может её в список литературы добавить? Скажем в "Level Up"
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
05.12.2014, 18:44
Gr1f0nn, еще важно понимать, что на одной конкретной системе, способ в Qt и способ в std:: сводятся к одним и тем же системным вызовам. Т.е. это всего лишь обертки над системным API для организации многопоточности. В windows - это WinAPI, в *nix, как правило, POSIX threads.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
как думаете, может её в список литературы добавить? Скажем в "Level Up"
Можно, но перевод и сам формат издания мне не очень понравились. Особенно хромает переплет.
Но в целом книга хорошая.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,034
Записей в блоге: 1
05.12.2014, 18:45
Цитата Сообщение от DrOffset Посмотреть сообщение
Особенно хромает переплет.
я вот тоже хочу заказать бумажный вариант, а то в нашей дыре такого не продают )))
0
05.12.2014, 18:58

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
я вот тоже хочу заказать бумажный вариант
Крайне рекомендую заказывать оригинал в таком случае. Хотя конечно с нынешним курсом это влетит в копейку.

0
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.12.2014, 21:31  [ТС]
В общем, я почитал еще немного о многопоточности, в частности, и в этих книгах. Решил запустить какой-нибудь простенький пример:

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
#include <iostream>
#include <QThread>
#include <thread>
 
using namespace std;
 
void hello()
{
    cout << "Hello world!" << "\n";
}
 
class my_thread : public QThread {
public:
    void run(){
        cout << "Hello world!" << "\n";
    }
};
 
int main()
{
    std::thread thr(hello);
    thr.start();
 
 
    my_thread thr1;
    thr1.start();
 
 
    return 0;
}
Не работают оба варианта. Выдает такие ошибки:

ошибка: QThread: No such file or directory
ошибка: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
ошибка: expected class-name before '{' token
ошибка: 'thread' is not a member of 'std'
ошибка: expected ';' before 'thr'
ошибка: 'thr' was not declared in this scope
ошибка: 'class my_thread' has no member named 'start'
На всякий случай напишу версию Qt
Code
1
2
Qt Creator 2.4.1 
Основан на Qt 4.7.4 (32-х битной)
Что не так делаю?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
05.12.2014, 22:14
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
QThread: No such file or directory
Это говорит о том, что Qt либо не установлен, либо не сконфигурирован правильно.

Цитата Сообщение от Gr1f0nn Посмотреть сообщение
#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
А это говорит о том, что не выставлена опция -std=c++0x, необходимая для того, чтобы работал std::thread.
Кстати, чтобы не было проблем, советую поставить самую последнюю версию компилятора.

Добавлено через 8 минут
Gr1f0nn, скачай инструментарий отсюда. Там онлайн установщик. Выбери Qt 5.3 и компилятор MinGW 4.8.2, остальные галочки можно убрать (по крайней мере на данном этапе). Итого получишь один из новых компиляторов с поддержкой С++11 (нужна будет опция -std=c++11 для того, чтобы работали новые возможности, в т.ч. std::thread) и Qt. Потом можно пробовать писать примеры.
1
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.12.2014, 22:19  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Это говорит о том, что Qt либо не установлен, либо не сконфигурирован правильно.
Вот это поворот. Самое интересное, что в GUI проекте, именно такой ошибки не было (однако были другие ^_^).

Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, чтобы не было проблем, советую поставить самую последнюю версию компилятора.
Если не ошибаюсь, то вроде как готовой сборки последней версии SDK на офф.сайте нет, есть только библиотеки и что-то еще (не вникал в эту терминологию) и надо это "собирать" самостоятельно, могу ошибаться

Добавлено через 50 секунд
DrOffset, За ссылку спасибо!
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
05.12.2014, 22:25
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Если не ошибаюсь, то вроде как готовой сборки последней версии SDK на офф.сайте нет, есть только библиотеки и что-то еще (не вникал в эту терминологию) и надо это "собирать" самостоятельно, могу ошибаться
Если воспользоваться методом, который я предложил, ничего собирать не надо. В принципе не надо ничего собирать и в других случаях, но установка в другие среды несколько сложнее (в том числе в объяснении как это делать)
0
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.12.2014, 22:31  [ТС]
DrOffset, В данном случае, мне проще пойти по пути наименьшего сопротивления, поэтому воспользовался Вашим методом

Не по теме:

Не ожидал, правда, что qt так вырос в объемах ~4-5 гб. Когда ставил предыдущую версию, то там чуть больше 1 гб было. Не экономят нынче место :)

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
05.12.2014, 22:43
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Не экономят нынче место
Ты галочки-то лишние поснимай )
Там ставятся версии для нескольких компиляторов, поэтому так много.
Выбери только версию для MinGW 4.8.2
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2014, 22:43
Помогаю со студенческими работами здесь

Как правильно реализовать многопоточность
Сколько не замечаю тем у многих проблема с многопоточностью, а именно с правильной ее реализацией... Прикладываю проэкт, пожалуйста,...

как реализовывается
point (p,a,b) // р - модуль x:=0; while (x&lt;p) w:=(x^3+ax+b) mod p // w - это у^2 if (w - целое значение квадратного корня Zр)...

Как реализовывается функция подписки на сайте?
Добрый день, я недавно начал изучать это направление, не могу разобраться, как реализовывается подписка на сайте? По идее, ты оставляешь...

Как реализовывается взаимосвязь клиента и программы на сервере
Здравствуйте! Помогите пожалуйста разобраться в web программировании. Я хочу сделать программу сервер и клиент. Сервер - ...

Не правильно работает многопоточность
Прошу помочь с проблемой, очень долго не могу разобраться, приложение - гонки машин(picturebox) При нажатии на кнопку button1 - 3 машины...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru