LINUX.ORG.RU

'this' in lambda and in class method is not the same when using vector of std::thread

 , , ,


0

3
#include <iostream>
#include <functional>
#include <thread>
#include <vector>

class t {
public:
    int m = 1;
    std::function<void()> f;
    t() {
        f = [this]() {
            std::cout << "2: " << this << std::endl;
            std::cout << m << std::endl;
        };
    }
    void operator()() {
        m = 2;
        std::cout << "1: " << this << std::endl;
        f(); // print 1
    }
};

int main() {
    std::vector<std::thread> threads;
    for(int i = 1; i <= 1; i++) {
        threads.emplace_back(t());
    }
    for (auto &thread : threads) {
        thread.join();
    }
}
Ответ на: комментарий от Siborgium

впринцепи разобрался, не важно что тут использовать, push_back, emplace_back и тд, при создании нового объекта в контейнере, копированием или перемещением, this в ламбде помнит указатель на исходный объект

threads.emplace_back(); - такое не будет работать

babushka
() автор топика
Ответ на: комментарий от babushka

this в ламбде помнит указатель на исходный объект

Конечно. Это же не убогий жабоскрипт, где this постоянно скачет и пришлось наваливать костылей, чтобы работало.

ox55ff ★★★★★
()
Ответ на: комментарий от babushka

Да, я с телефона неправильно понял код.

Конструктор std::thread в любом случае будет делать move/copy на передаваемом в него объекте, и this будет меняться. Этого можно избежать, если передавать вместо исходного объекта обертку, содержащую ссылку на него, например,

t your_object;
// ...
threads.emplace_back(std::ref(your_object));
Siborgium ★★★★★
()
Ответ на: комментарий от Siborgium

Вариант. Главное, чтобы your_object раньше этого создаваемого потока не умер.

rumgot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.