Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
1

Указатели и std::thread

30.05.2016, 10:34. Просмотров 1086. Ответов 5
Метки нет (Все метки)

Всем здрасьте !
Возникла проблема в понимании ...
Возможно я написал не в ту тему, но думаю тут есть эксперты.

У меня есть класс A, в нём есть указатель на данные и есть объект std::thread - поток, в котором надо будет эти данные "загрузить".

Кликните здесь для просмотра всего текста
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
32
33
34
35
36
37
38
class A
{
public:
    void InitData();
 
private:
// Данные
    int *m;
    
// точка входа потока
    static void ThreadMain(A* p);
 
}
 
 
void A::InitData()
{
    thread t(ThreadMain, this);
    t.join();
}
 
 
void A::ThreadMain(A* p)
{
    p->m = new int[100];
    for(int i = 0; i < 100; i++)
        p->m[i] = ...
}
 
 
int main()
{
    A* p = new A;
 
    p->InitData();
 
    return 0;
}


Правильно ли этот код будет работать ? Допустим, если я потом захочу обратиться к m, мне не выдаст мусор ?

Вот я создаю поток и передаю ему входную точку и аргумент(являющийся самим классом). В качестве аргумента, я передаю this - адрес моего класса А, в котором поток создался.

Не должен ли я был добавить & к аргументу ? Я же ему отправил адрес, и он в памяти создаст копию моего класса А, и будет работать в копии, разве не так ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2016, 10:34
Ответы с готовыми решениями:

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

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

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

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

5
6912 / 5977 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
30.05.2016, 11:58 2
Цитата Сообщение от BeginerMan Посмотреть сообщение
и он в памяти создаст копию моего класса А
Откуда ты это взял? Поток будет работать с тем объектом, который передан.
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
30.05.2016, 12:08  [ТС] 3
Спасибо !
А допустим, что мне надо будет пересоздать класс:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
void ThreadMain()
{
 //...
 delete A;
 // ...
 A = new A;
 // Тут присваиваются другие значения для m
 //
}

я тоже буду находится в своём прежнем А, который вошёл аргументом в поток ?
И как будет реагировать тот А, который в main ? Мы же ему новую память выделили
0
491 / 205 / 69
Регистрация: 27.05.2016
Сообщений: 545
30.05.2016, 12:26 4
Цитата Сообщение от BeginerMan Посмотреть сообщение
Допустим, если я потом захочу обратиться к m, мне не выдаст мусор ?
Не должно:
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
32
33
34
35
36
class A
{
public:
    void InitData();
    int get_size() const {return size;}
    int* get_array() const {return  m;}
    ~A() {delete [] m;}
private:
    int *m;
    int size = 100;
    static void ThreadMain(A* p);
};
 
void A::InitData()
{
    std::thread t(ThreadMain, this);
    t.join();
}
 
//static
void A::ThreadMain(A* p)
{
    p->m = new int[p->get_size()];
    for(int i = 0; i < 100; i++)
        p->m[i] = i;
}
 
 
int main()
{
    A* p = new A;
 
    p->InitData();
    for (int i = 0; i < p->get_size(); ++i)
        std::cout << p->get_array()[i] << " ";
}
0
2535 / 1195 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
30.05.2016, 12:49 5
Цитата Сообщение от notAll Посмотреть сообщение
std::thread t(ThreadMain, this);
* * t.join();
а чем эта запись отличается от обычного вызова метода без потоков?
0
491 / 205 / 69
Регистрация: 27.05.2016
Сообщений: 545
30.05.2016, 13:11 6
Ни чем, это же очевидно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2016, 13:11

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

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

Многопоточность в C++11. std::thread
Привет всем! использую таким образом многопоточность class A { public: void fun() {...

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

Std::thread в классе
Всем привет есть код #include&lt;thread&gt; #include&lt;iostream&gt; class SomeClass { public : ...


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

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

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