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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 69, средняя оценка - 4.67
septe-mber
0 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 123
02.04.2014, 02:54     Многопоточность в C++11. std::thread #1
Привет всем! использую таким образом многопоточность

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();
}
компилятор выдает ошибку ...

объясните пожалуйста, что делаю не так ? ( в многопоточности новичок )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 02:54     Многопоточность в C++11. std::thread
Посмотрите здесь:

C++ std::thread
Как убить std::thread? C++
C++ Boost::thread vs std::thread
C++ Std::thread, создать указатель на член класса
Копирование объектов std::thread C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 03:11     Многопоточность в C++11. std::thread #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();
}
septe-mber
0 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 123
02.04.2014, 03:36  [ТС]     Многопоточность в C++11. std::thread #3
alsav22, вот я одно не понимаю, передали функцию в std::thread thr(threadFunction); потом вызываем thr.join(), и создали новый поток. и какой выгрыш от этого ? я понимаю если вызвали thr.detach(); который делает поток фоновым и с связи с этим программа работает быстрее, т.к параллельно выполняется основной поток и фоновый поток ...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 03:49     Многопоточность в C++11. std::thread #4
Цитата Сообщение от septe-mber Посмотреть сообщение
и какой выгрыш от этого ?
В данном примере - никакой. Это только пример создания потока. Но можно, в main(), создать несколько таких потоков, передать в них функции для выполнения, main() заблокировать. Функции в потоках будут выполняться одновременно (условно).
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2014, 11:49     Многопоточность в C++11. std::thread #5
Цитата Сообщение от alsav22 Посмотреть сообщение
одновременно (условно).
почему условно? наличие нескольких ядер/процов и уже одновременность вполне реальная.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
02.04.2014, 11:53     Многопоточность в C++11. std::thread #6
А шины тоже у каждого ядра свои ?
все таки условная.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
02.04.2014, 12:03     Многопоточность в C++11. std::thread #7
Цитата Сообщение от egor2116 Посмотреть сообщение
А шины тоже у каждого ядра свои ?
окей, скажите это разработчикам многоядерных процессоров, что они копают вникуда, что данная технология это бред, что никакого выигрыша, и т.д и т.п
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
02.04.2014, 12:08     Многопоточность в C++11. std::thread #8
я не говорил что нет ни какого выигрыша.
По логике вещей могоядер. проц. может выполняет несколько нитей одновременно, но когда данные идут дальше, шина ведь одна и передают они по очереди, а когда одно ядро то выполнилась нить и передалась остальные ждут пока проц. освободится. Я так понимаю и происходит выигрыщь за счет многоядерности.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,914
Записей в блоге: 2
Завершенные тесты: 1
02.04.2014, 12:15     Многопоточность в C++11. std::thread #9
Цитата Сообщение от Tulosba Посмотреть сообщение
почему условно?
а может попасться машина с одним ядром. Всё будет псевдо-параллельно.
aLarman
02.04.2014, 12:16
  #10

Не по теме:

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

egor2116
02.04.2014, 12:21
  #11

Не по теме:

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


Не по теме:

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

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2014, 12:22     Многопоточность в C++11. std::thread #12
Цитата Сообщение от egor2116 Посмотреть сообщение
А шины тоже у каждого ядра свои ?
Давайте ещё скажем, что монитор единственный к компю подключен, значит параллельность условная.
Не надо путать вычислительные части и каналы передачи данных между этими частями.
Если на однопроцессорной/ядерной архитектуре многопоточность/процессность достигается обязательным переключением контекстов, так что в единственный момент времени вычисляется только одна задача, то на многоядерных системах кол-во действительно одновременно выполняемых вычислений может достигать кол-ва ядер. А как данные будут переданы дальше - это уже совсем другая история.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
а может попасться машина с одним ядром.
А может и вообще без ядра Я собственно же написал не просто так:
Цитата Сообщение от Tulosba Посмотреть сообщение
наличие нескольких ядер/процов и уже одновременность вполне реальная
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
02.04.2014, 12:24     Многопоточность в C++11. std::thread #13
Абсолютно согласен, я про это и писал. Я лишь хотел сказать что всегда будет узкое место. Это тоже как поставить кучу опер. памяти, но если шина ограничена каким то каналом то хоть 1мл Гб оперативки ставь улучшения не будет.
Кстати мониторов можно и несколько подключить
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 17:26     Многопоточность в C++11. std::thread #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();
 
}
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
02.04.2014, 17:31     Многопоточность в C++11. std::thread #15
В код оптимизируеться во втором нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 17:39     Многопоточность в C++11. std::thread #16
Цитата Сообщение от stima Посмотреть сообщение
код оптимизируеться во втором нет.
Почему? Как сделать, чтобы оптимизировался в двух случаях? Или чтобы в первом не оптимизировался?
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
02.04.2014, 17:43     Многопоточность в C++11. std::thread #17
Пруф

g++ -c test.cpp -std=c++11
objdump -d test.o
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 17:56     Многопоточность в C++11. std::thread #18
Это чтобы что?
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
02.04.2014, 17:58     Многопоточность в C++11. std::thread #19
1. Компиляторы давно научились выкидывать "пустые циклы" или не использованный код, а также делать некоторые расчеты в период компиляции (что привело к появлению constexpr)
2, 3. Этого я Вам не подскажу.

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

Добавлено через 1 минуту
п.с. Это чтобы дизассемблировать, и посмотреть происходит оптимизация и какой код еще "появился"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 18:07     Многопоточность в C++11. std::thread
Еще ссылки по теме:

C++ Std::thread как усыпить/ пробудить поток?
C++ Std::thread автоматическая многопоточность
C++ Запутался с std::thread в классе

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.04.2014, 18:07     Многопоточность в C++11. std::thread #20
Цитата Сообщение от stima Посмотреть сообщение
1. Компиляторы давно научились выкидывать "пустые циклы" или не использованный код, а также делать некоторые расчеты в период компиляции (что привело к появлению constexpr)
Почему, когда несколько потоков, это не делается?
Yandex
Объявления
02.04.2014, 18:07     Многопоточность в C++11. std::thread
Ответ Создать тему
Опции темы

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