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

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

05.12.2014, 16:33. Показов 2713. Ответов 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
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,641
Записей в блоге: 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
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,641
Записей в блоге: 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
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,641
Записей в блоге: 6
05.12.2014, 17:12
На самом деле эта книга не для новичков. Я бы рекомендовал для начала ознакомиться с многопоточностью у Джоссатиса Стандарная библиотека С++(второе изд.)
1
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.12.2014, 17:21  [ТС]
Ilot, Да, пожалуй, для начала было бы мне неплохо разобраться с этой темой, читая книгу на русском ^_^
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
05.12.2014, 18:38
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Да, пожалуй, для начала было бы мне неплохо разобраться с этой темой, читая книгу на русском ^_^
Первая книга тоже есть на русском (правда в отвратительном переплете). Русское название: "Параллельное программирование на С++ в действии. Практика разработки многопоточных программ"
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
05.12.2014, 18:40
DrOffset, как думаете, может её в список литературы добавить? Скажем в "Level Up"
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
05.12.2014, 18:44
Gr1f0nn, еще важно понимать, что на одной конкретной системе, способ в Qt и способ в std:: сводятся к одним и тем же системным вызовам. Т.е. это всего лишь обертки над системным API для организации многопоточности. В windows - это WinAPI, в *nix, как правило, POSIX threads.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
как думаете, может её в список литературы добавить? Скажем в "Level Up"
Можно, но перевод и сам формат издания мне не очень понравились. Особенно хромает переплет.
Но в целом книга хорошая.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru