【问题标题】:Accessing object (using reference or pointer) from a thread从线程访问对象(使用引用或指针)
【发布时间】:2013-04-23 19:36:10
【问题描述】:

我有一个 C++ 进程,它初始化一个存储在std::map 中的一些数据的类,然后是另一个类——将在一个线程中执行——我将一个指针传递给它(我也尝试了一个引用)第一类,因为它需要访问std::map 的内容(使用getter)。

发生的情况是,当我从主线程更新时,来自第一类 std::map 的数据永远不会更新。

我的问题是我的问题是因为我正在使用线程以便复制对象然后没有收到更新? 以及如何解决这个问题?

谢谢

【问题讨论】:

  • 你不能“初始化一个类”。你只能初始化objects
  • 您确实需要发布一些代码。我们不知道您是通过副本传递还是通过引用传递,您是如何创建线程的,等等
  • 而且你也不能执行一个类(尽管有时我希望我可以执行一些库设计者^_^)。

标签: c++ multithreading object pointers reference


【解决方案1】:

不,std::map 是一个普通的容器,与线程无关。很可能您的线程之间存在同步问题,例如一个线程在另一个线程更新映射之前或同时查看映射的竞争条件。在这些情况下可能会发生奇怪的事情,因为std::map 可能会在添加、更改或删除某些内容时更改许多内部指针以重新平衡树。另一个线程同时查看地图可能会“感到困惑”。

在从任一线程访问地图时尝试使用信号量或互斥锁,看看是否能解决您的问题。

【讨论】:

  • 请不要使用信号量!使用 std::mutex。 C++11 委员会没有包含 std::semaphore 是有原因的。信号量“太灵活”,因此更难推断正确性(对于人类和工具)。
【解决方案2】:

首先感谢大家的 cmets(即使是没有帮助的 cmets)。

我终于找到了我遇到的问题。 我正在使用 Boost 信号更新包含 std::map 的类,并且在没有 & 的情况下传递了我的类实例化,因此正在处理副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2011-05-16
    • 2023-04-10
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多