Почему он не обновляет мои переменные функции? (темы с классами) - PullRequest
0 голосов
/ 13 марта 2020

Это мой код:

    MessagesSender all;

std::thread t1(&MessagesSender::updateMessages,all);
    std::thread t2(&MessagesSender::sendMessages,all);
            all.signIn();
t1.join();
t2.join();

Внутри функции потоков есть al oop, который поддерживает работу потока каждые шестьдесят секунд. Функция входа изменяет одну из переменных в 'all', но потоки игнорируют это изменение и не обновляют объект, как если бы я отправил два разных объекта.

Вот мой класс:

class MessagesSender
{
public:
    void Menu();
    void signIn();
    void signOut();
    void showUsers();
    bool checkIfExist(std::string name);
    void updateMessages();
    void sendMessages();
protected:
    std::vector<std::string> users;
    std::queue<std::string> messages;
};

И функция входа в систему:

void MessagesSender::signIn()
{
    std::string name = "";
    std::cout << "Enter name\n";
    std::cin >> name;
    if (checkIfExist(name))
    {
        std::cout << "User already exists!\n";
    }
    else
    {
        users.push_back(name);
    }
}

1 Ответ

1 голос
/ 13 марта 2020

Например,

std::thread t1(&MessagesSender::updateMessages,all);

вы создаете поток, используя копию объекта all.

При изменении исходный объект all, копии которых работают с потоками, не будут изменены.

При создании потока необходимо использовать ссылку или указатель:

std::thread t1(&MessagesSender::updateMessages,&all);

Также Остерегайтесь гонок данных, вам нужно убедиться, что переменные-члены, измененные signIn, защищены, поэтому потоки не пытаются получить к ним доступ одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...