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

Многопоточность в C++11. std::thread

02.04.2014, 02:54. Просмотров 21397. Ответов 20
Метки нет (Все метки)

Привет всем! использую таким образом многопоточность

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
public:
    void fun()
    {
 
    }
};
int main(int argc, char *argv[])
{
A p;
    std::thread th(p);
    th.join();
}
компилятор выдает ошибку ...

объясните пожалуйста, что делаю не так ? ( в многопоточности новичок )
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2014, 02:54
Ответы с готовыми решениями:

Std::thread автоматическая многопоточность
Есть данный пример создания массива thread и инициализации его в цикле. #include<iostream> ...

Использование std::function в std::thread
Нужно вызвать function fnc в новом потоке. Как сделать? function <void(vector<char>)> fnc; void...

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list"
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в...

Boost::thread vs std::thread
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в...

20
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 03:11 2
http://habrahabr.ru/post/182610/

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <thread>
#include <iostream>
 
class A
{
public:
    void operator()()
    {
        std::cout << "AAA" << std::endl;
    }
};
 
int main(int argc, char *argv[])
{
    A p;
    std::thread th(p);
    th.join();
}
1
1 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 123
02.04.2014, 03:36  [ТС] 3
alsav22, вот я одно не понимаю, передали функцию в std::thread thr(threadFunction); потом вызываем thr.join(), и создали новый поток. и какой выгрыш от этого ? я понимаю если вызвали thr.detach(); который делает поток фоновым и с связи с этим программа работает быстрее, т.к параллельно выполняется основной поток и фоновый поток ...
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 03:49 4
Цитата Сообщение от septe-mber Посмотреть сообщение
и какой выгрыш от этого ?
В данном примере - никакой. Это только пример создания потока. Но можно, в main(), создать несколько таких потоков, передать в них функции для выполнения, main() заблокировать. Функции в потоках будут выполняться одновременно (условно).
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2014, 11:49 5
Цитата Сообщение от alsav22 Посмотреть сообщение
одновременно (условно).
почему условно? наличие нескольких ядер/процов и уже одновременность вполне реальная.
0
582 / 385 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
02.04.2014, 11:53 6
А шины тоже у каждого ядра свои ?
все таки условная.
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
02.04.2014, 12:03 7
Цитата Сообщение от egor2116 Посмотреть сообщение
А шины тоже у каждого ядра свои ?
окей, скажите это разработчикам многоядерных процессоров, что они копают вникуда, что данная технология это бред, что никакого выигрыша, и т.д и т.п
0
582 / 385 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
02.04.2014, 12:08 8
я не говорил что нет ни какого выигрыша.
По логике вещей могоядер. проц. может выполняет несколько нитей одновременно, но когда данные идут дальше, шина ведь одна и передают они по очереди, а когда одно ядро то выполнилась нить и передалась остальные ждут пока проц. освободится. Я так понимаю и происходит выигрыщь за счет многоядерности.
0
Грамотный. Безпорно.
16787 / 9683 / 1869
Регистрация: 27.09.2012
Сообщений: 24,028
Записей в блоге: 2
02.04.2014, 12:15 9
Цитата Сообщение от Tulosba Посмотреть сообщение
почему условно?
а может попасться машина с одним ядром. Всё будет псевдо-параллельно.
0
aLarman
02.04.2014, 12:16
  #10

Не по теме:

egor2116, всегда будет какое-то "узкое место" :)

0
egor2116
02.04.2014, 12:21
  #11

Не по теме:

egor2116, всегда будет какое-то "узкое место"


Не по теме:

Ну так я об этом и говорю.

0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2014, 12:22 12
Цитата Сообщение от egor2116 Посмотреть сообщение
А шины тоже у каждого ядра свои ?
Давайте ещё скажем, что монитор единственный к компю подключен, значит параллельность условная.
Не надо путать вычислительные части и каналы передачи данных между этими частями.
Если на однопроцессорной/ядерной архитектуре многопоточность/процессность достигается обязательным переключением контекстов, так что в единственный момент времени вычисляется только одна задача, то на многоядерных системах кол-во действительно одновременно выполняемых вычислений может достигать кол-ва ядер. А как данные будут переданы дальше - это уже совсем другая история.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
а может попасться машина с одним ядром.
А может и вообще без ядра Я собственно же написал не просто так:
Цитата Сообщение от Tulosba Посмотреть сообщение
наличие нескольких ядер/процов и уже одновременность вполне реальная
0
582 / 385 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
02.04.2014, 12:24 13
Абсолютно согласен, я про это и писал. Я лишь хотел сказать что всегда будет узкое место. Это тоже как поставить кучу опер. памяти, но если шина ограничена каким то каналом то хоть 1мл Гб оперативки ставь улучшения не будет.
Кстати мониторов можно и несколько подключить
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 17:26 14
Цитата Сообщение от Tulosba Посмотреть сообщение
почему условно?
Потому что в одних случаях действительно одновременно, в других нет. Зависит от многих причин. Можно, вместо "условно", другое слово подобрать.

Добавлено через 14 минут
Знатоки многопоточности, лучше объясните такое: есть код (ниже), если функции последоватьельно выполняются (Debug), время работы программы - 28сек. (при неполной, неравномерной, загрузке двух ядер), если - в двух потоках, то время работы, при 100%-й загрузке двух ядер, 128сек.
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
#include <thread>
#include <string>
#include <iostream>
 
void f1()
{
    for (int i = 0; i < 100000000; ++i)
    {
        std::string str = "absdef";
    }
}
 
void f2()
{
    for (int i = 0; i < 100000000; ++i)
    {
        std::string str = "qwert";
    }
}
 
int main(int argc, char *argv[])
{
    //f1();
    //f2();
 
    std::thread th1(f1);
    std::thread th2(f2);
    th1.join();
    th2.join();
 
}
0
498 / 348 / 93
Регистрация: 22.03.2011
Сообщений: 1,108
02.04.2014, 17:31 15
В код оптимизируеться во втором нет.
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 17:39 16
Цитата Сообщение от stima Посмотреть сообщение
код оптимизируеться во втором нет.
Почему? Как сделать, чтобы оптимизировался в двух случаях? Или чтобы в первом не оптимизировался?
0
498 / 348 / 93
Регистрация: 22.03.2011
Сообщений: 1,108
02.04.2014, 17:43 17
Пруф

g++ -c test.cpp -std=c++11
objdump -d test.o
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 17:56 18
Это чтобы что?
0
498 / 348 / 93
Регистрация: 22.03.2011
Сообщений: 1,108
02.04.2014, 17:58 19
1. Компиляторы давно научились выкидывать "пустые циклы" или не использованный код, а также делать некоторые расчеты в период компиляции (что привело к появлению constexpr)
2, 3. Этого я Вам не подскажу.

Также учтите время на обработку кода "синхронизации/локов/захвата потоков и т.д."

Добавлено через 1 минуту
п.с. Это чтобы дизассемблировать, и посмотреть происходит оптимизация и какой код еще "появился"
1
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 18:07 20
Цитата Сообщение от stima Посмотреть сообщение
1. Компиляторы давно научились выкидывать "пустые циклы" или не использованный код, а также делать некоторые расчеты в период компиляции (что привело к появлению constexpr)
Почему, когда несколько потоков, это не делается?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2014, 18:07

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

Boost::thread std::thread
чем отличается boost::thread( ) от std::thread (с++17)? я спрашиваю не о способе реализации...

Thread. Многопоточность
Привет! есть код, код не мой, но хотелось бы разобраться, по возможности. Нужно генерировать строки...

std::thread
Возник вопрос: как создать массив потоков (точнее, как его инициализировать). То есть, мне нужно...

Конструктор std::thread
Доброго времени суток, помогите, пожалуйста, понять, в чем ошибка? #include &lt;functional&gt;...


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

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

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