LINUX.ORG.RU

Передача параметра в другой поток в C++

 ,


0

2

Мы передаем объект в другой поток. Объект data должен удалиться в методе oops2(). Как возможно чтобы этот объект продолжал существовать в другом потоке?

class Data {
public:
    Data(int val = 0) {}
    int getVal () const { return mVal; }
    void setVal(int val) { mVal = val; }
protected:
    int mVal;
};

void set_val(int& i, Data* data)
{
    data->setVal(i);
}

void print_val(Data* data)
{
    cout << "Data value = " << data->getVal() << endl;
}

struct func2
{
    Data* data;
    func2(Data* data_): data(data_){}

    void operator()()
    {
        printf("Address of func2 data is %p\n", data);
        for (int j=0;j < 1000000;++j)
        {
            print_val(data);
            set_val(j, data);
        }
    }
};

void oops2()
{
    Data* data = new Data(100);
    func2 my_func(data);
    my_thread = std::thread(my_func);
    delete data;
}

int main()
{
    oops2();
    my_thread.join();
    return 0;
}

Как возможно чтобы этот объект продолжал существовать в другом потоке?

Не удалять его в основном. Зачем ты его удаляешь, когда известно что он нужен в другом потоке?

deep-purple ★★★★★
()

Объект data должен удалиться в методе oops2().

Точно?

Как возможно чтобы этот объект продолжал существовать в другом потоке?

Скопировать его, например. А вообще следует думать в сторону совместного владения объектом, подсчёта ссылок и shared_ptr. И следует почитать что-нибудь про современный С++ и не использовать голые указатели.

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от Begemoth

Задача то как раз состоит в том чтобы сделать UB. А не решить как это сделать правильно. Я ждал bad access, а вместо этого все работает.

ECLIPSE
() автор топика
Последнее исправление: ECLIPSE (всего исправлений: 1)

Контекст переключился вот он и успел ещё пожить? В системах с ванильным планировщиком надо подождать примерно 25(как я понял зависит от тактовой частоты и ещё каких то попугаев)*<количество потоков в системе>/количество ядер(учитывая ht ядра) миллисекунд, что бы быть уверенным на 100% что твой поток точно произвёл заданное действие.

И даже, если контекст не переключался, старт потока со всем своим пэйлоадом возможно происходит в основном потоке в блокирующем режиме. И если найдётся свободное ядро, то он начнёт выполнятся в прямом смысле параллельно с потоком его породившим. Дальше - считай инструкции cpu и их стоимость...

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 2)
Ответ на: комментарий от ECLIPSE

delete не зануляет память.

сделать UB
Я ждал

Ты точно понимаешь смысл UB.

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

сделать UB

И? Что ты от него ожидаешь? Ну помести в Data какой-нибудь std::string, засинхронизируй работу второго потока и удаление объекта.

Не понятна конечная цель сего действа.

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

В том то и дело что если выводить на консоль каждое j то все выполняется после того как был вызван метод oops2(). А что за трейт Send? Если можно ссылочку что почитать.

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

сделать UB

Оно может ни к чему видимому не приводить. Чтобы упало можно какие-нибудь указатели добавить и новые объекты создавать в основном потоке, например.

А что за трейт Send?

Тот аноним просто пишет на одном из языков троллей, можно не обращать внимание.

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

А что за трейт Send? Если можно ссылочку что почитать.

Это троллинг и намек писать на Rust.

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

Всем спасибо кроме анонимуса, разобрался.

ECLIPSE
() автор топика

псс, парень. Я тебе тут мув семантики принес. Попробуй, не пожалеешь.

anonymous
()
Ответ на: комментарий от ECLIPSE

Я ждал bad access

UB в том и заключается, что результат непредсказуем.

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

Задача то как раз состоит в том чтобы сделать UB
Я ждал bad access

Немного противоречит другу другу. Если ты ожидаешь какую-то конкретную ошиюку, то это не ub. UB - это когда ты не можешь предсказать поведение из стандарта. В твоем случае ub и есть.

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

Задача то как раз состоит в том чтобы сделать UB.

UB - это любое поведение, в том числе и то, которое ты наблюдаешь.

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