gpt4 book ai didi

c++ - 如何正确更改函数内的对象?

转载 作者:行者123 更新时间:2023-11-28 02:23:25 24 4
gpt4 key购买 nike

在我的应用程序中,我有一个线程运行一个对象的函数。在函数中,对象的一些元素发生了变化,但是我无法在主线程中看到这些变化。

我觉得我可能没有更改正确的对象。这准确吗?

主题:

thread_.emplace_back(&Philosopher::Live, philosopher_[i]);

返回:

Philosopher::_state current_state_;
current_state_ = philosopher_[i].ReturnState();

最佳答案

您可能面临两个问题之一*,如果没有 Minimal, Complete, Verifiable Example,我无法确定是哪个问题。

您正在传递拷贝

因为没有 philosopher[i 的上下文和声明] 我不能确定,但​​你可能传递了一份拷贝。考虑:

struct Philosopher 
{
void Live();
int ReturnState();
private:
int state;
};

std::vector<Philosopher> philosopher_;
philosopher_.emplace_back(...);
std::vector<std::thread> thread_;
thread_.emplace_back(&Philosopher::Live, philosopher_[i]); // A copy of Philosopher is passed
...
int state = philosopher_[i].ReturnState(); // philosopher[i] has not changed.

但是,如果 std::vector<Philosopher>std::vector<Philosopher*>,那么您将不会传递一个拷贝(因此为什么没有 philosopher_ 的声明很难看到。如果您已将 philosopher_ 声明为 std::vector<Philosopher>,您可以用 std::ref 或传递一个指针来修复它:

std::ref :

std::vector<Philosopher> philosopher_;
...
thread_.emplace_back(&Philosopher::Live, std::ref(philosopher_[i])); // A reference is passed

指针:

std::vector<Philosopher> philosopher_;
...
thread_.emplace_back(&Philosopher::Live, &philosopher_[i]); // A pointer is passed

你没有锁定你的对象,也没有让你的线程有机会运行

感谢@deviantfan 在评论中指出了下一点。考虑:

struct Philosopher 
{
void Live();
int ReturnState();
private:
int state;
};

std::vector<Philosopher> philosopher_;
philosopher_.emplace_back(...);
std::vector<std::thread> thread_;
thread_.emplace_back(&Philosopher::Live, std::ref(philosopher_[i]));
// There is no guarantee that by the time the code reaches here, Philosopher::Live would've had a chance to run and finish.
int state = philospher_[i].ReturnState();

您可能没有让 Philosopher::Live 有机会运行并完成。您可以通过多种方式处理此问题,但我将只介绍“等待线程完成”。

std::vector<Philosopher> philosopher_;
...
thread_.emplace_back(&Philosopher::Live, std::ref(philosopher_[i]));
thread_[i].lock(); // Wait for the thread to finish
int state = philospher_[i].ReturnState();

这可能需要也可能不需要,具体取决于您要实现的目标。如果您想了解其他一些方法,请考虑阅读有关 std::mutex std::conditional_variable 的内容

*我在撰写本文时意识到已经解决了的问题;然而,这只是一个深入的答案,旨在帮助有类似问题的人(而且你可能会学到新东西!)看起来你可能希望使用 a mutex 来实现线程安全。

关于c++ - 如何正确更改函数内的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31508463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com