Розыгрыш Premium и Уникальной юзергруппы на форуме! Перейти

Разъясните по потокам C++11

  • Автор темы Автор темы Mr.White
  • Дата начала Дата начала
0ldB8y
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
8 Дек 2018
Сообщения
133
Реакции
63
Столкнулся с проблемой: после создания дополнительного потока, без ожидания его завершения функцией thread.detach(), не получается изменить значения членов класса из основного потока. Если использовать thread.join(), то такой проблемы нет, но мне не нужно ждать завершения доп. потока, а доступ нужен из главного потока.

Собственно данный код это иллюстрирует, bVar внутри checkVar() всегда false, хотя из main() я присваиваю ей true;

Код:
Expand Collapse Copy
#include <iostream>
#include <thread>
#include <windows.h>

using namespace std;

class Foo
{
public:
    bool bVar = false;

    void checkVar()
    {
        while (true)
        {
            cout << "checkVar: " << bVar << endl;

            Sleep(1000);
        }
    }
};

int main()
{
    Foo bar;
    thread thr1(&Foo::checkVar, bar);
    thr1.detach();  
   
    while (true)
    {              
        bar.bVar = true;
        cout << "setted bVar to: " << bar.bVar << endl;

        Sleep(1000);
    }
    return 0;
}
 
Столкнулся с проблемой: после создания дополнительного потока, без ожидания его завершения функцией thread.detach(), не получается изменить значения членов класса из основного потока. Если использовать thread.join(), то такой проблемы нет, но мне не нужно ждать завершения доп. потока, а доступ нужен из главного потока.

Собственно данный код это иллюстрирует, bVar внутри checkVar() всегда false, хотя из main() я присваиваю ей true;

Код:
Expand Collapse Copy
#include <iostream>
#include <thread>
#include <windows.h>

using namespace std;

class Foo
{
public:
    bool bVar = false;

    void checkVar()
    {
        while (true)
        {
            cout << "checkVar: " << bVar << endl;

            Sleep(1000);
        }
    }
};

int main()
{
    Foo bar;
    thread thr1(&Foo::checkVar, bar);
    thr1.detach();
 
    while (true)
    {            
        bar.bVar = true;
        cout << "setted bVar to: " << bar.bVar << endl;

        Sleep(1000);
    }
    return 0;
}
Если вызвать функцию через лямда выражение, то будет работать
C++:
Expand Collapse Copy
thread thr1([&]() {bar.checkVar(); });
 
Если вызвать функцию через лямда выражение, то будет работать
C++:
Expand Collapse Copy
thread thr1([&]() {bar.checkVar(); });
Да, действительно работает, но выглядит сложновато. Я нашел более простой способ, это передача объекта по ссылке.
C++:
Expand Collapse Copy
thread thr1(&Foo::checkVar, &bar);
 
Последнее редактирование:
Назад
Сверху Снизу