【问题标题】:Node pointed by pointer not have changes [closed]指针指向的节点没有变化[关闭]
【发布时间】:2012-07-31 06:55:43
【问题描述】:

我有一个问题,我的线程代码中有这个指针,它们正在那里被修改,但是当它返回到主代码时,变化不是这样的:

线程

void threaded_function(Model_factory &mf, ppa::Node *root) { // threads management

try { // n try...

主要

 int main(int argc, char *argv[]) { ...

我主要创建一个节点根,然后在线程中为节点提供序列,并有一个 bool 更改为 true,如:

ppa::Node *root;

在线程正在工作(一个线程组)中,我可以根据需要获取并设置该布尔值,但是当线程组以 join all 结束时(这是 boost),指针根在这一行上给我 0

cout << root->has_sequence() << endl;

在这继续之后,节点又被填充了一些东西,所以我想问的是为什么我的节点指针没有反映线程中的变化,是设计还是我错了(可能是第二个)以及什么我应该做一个全局根节点来解决我的问题,但是为什么呢?

【问题讨论】:

  • 你能把它减少到一个 minimal 但可能重现问题的完整示例吗?我会尝试运行和研究更小的东西,但目前它太大了,缺少main() 并且依赖于我们看不到的外部事物。您是否尝试过在 hlgrind 之类的工具中运行它?
  • 是的,我知道很多,问题是我不知道比赛条件在哪里,不,我没试过我会的,不,因为我不知道我不知道我想我可以减少它。
  • 我已经阅读了它,但不幸的是不知道原因在哪里,我认为我不能。
  • main 是不需要的,它有很多额外的东西,线程在那里。
  • 这是很多代码。存在大量线程检查器和分析器 - 只需使用一个,例如英特尔线程检查器或 Sun/Oracle 线程分析器。

标签: c++ multithreading pointers boost


【解决方案1】:

如果您有竞争条件,您必须怀疑您正在访问未锁定的关键部分。我注意到您正在手动锁定和解锁 mutex 变量。这可能会导致您的代码出错。例如,这个结构看起来特别令人震惊:

for (int i = 0; i < deque_done.size(); i++) {

    tuple_compare(deque_done.at(i));

    result_mutex.unlock();

}

您可以考虑使用boost::recursive_mutexboost::recursive_mutex::scoped_lock 来管理锁的获取和释放,而不是手动锁定和解锁。

boost::recursive_mutex result_mutex;

void foo () {
    boost::recursive_mutex::scoped_lock lock(result_mutex);
    //...
}

如果你真的坚持设计一个允许从多个线程重入的递归算法,也许你可以使用boost::shared_mutexboost::shared_lock/boost::upgradeable_lock作为读锁,boost::unique_lock/@987654330 @ 用于写访问。 You can follow this link for an example.

【讨论】:

  • 那会怎么样,你能举个例子吗? (:
  • @user1423656:我为shared_mutex 添加了一个链接,并为recursive_mutex 添加了一个简单示例。问候
  • 好吧,如果有人感兴趣,那就是这一行,把它放在后面因为它工作正常,谢谢,就像这样 for (int i = 0; i
猜你喜欢
  • 2021-02-19
  • 2017-05-29
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2018-09-20
  • 2017-09-01
相关资源
最近更新 更多