【发布时间】:2013-10-10 21:32:21
【问题描述】:
我正在使用 std::thread 来执行多个线程。我将指向数组的指针作为参数传递,类似于:
my_type* rest[count];
//Fill rest array
std::thread(fnc, rest, count);
我似乎遇到的问题是,在某个地方,“rest”中的指针值被破坏了。我在调用 std::thread 之前打印出指针值,以及 std::thread 代表我调用的函数中的第一件事,并且值不匹配。它看起来相当随机,有时它们会匹配,有时不匹配(当后者发生时会导致段错误)。
我知道(从我能在该主题上找到的一点点)std::thread 复制了参数,我认为我的问题源于此,并且有一个特殊的函数 std::ref()允许它传递引用,但没有一个特别提到指针。我尝试了各种技术来尝试使用 std::ref() 传递这个数组,但我还没有解决这个问题。
我认为这可能是我的问题的原因是正确的,还是我找错了树?
【问题讨论】:
-
rest是局部变量吗?在fnc开始执行之前它是否可能超出范围?std::thread只会将指针复制到数组的第一个元素 - 而不是元素本身。只要fnc正在运行,它们就最好保持活力。 -
@IgorTandetnik 没有休息是一个永远不应该超出范围的指针。它传递给我的“创建线程”函数,在 std::thread 调用之前有效,在它之后有效。实际的指针(由 %p 用 printf 打印)在新线程内部是不同的。现在,当我在线程创建之后放置一个 sleep(1) (允许线程在调用函数之前完成)它(似乎)可以工作。我一直在努力寻找可能发生这种情况的任何原因,因为“休息”早已超越了功能。
-
"并且在 std::thread 调用之前有效,在它之后有效" 它在线程的整个生命周期内都有效吗?当您在 C++ 中传递数组时,它会自动转换为指针(不幸的是,这是从 C 继承的不良行为),因此如果数组是局部变量,那么您将指针传递给局部变量;只要使用该指针,局部变量就必须保持活动状态。
-
由于 C++ 中原始数组的不良行为,我建议您使用
std::array或std::vector。两者都有值语义,这比原始数组的怪异要明智得多。 -
请发SSCCE。
标签: c++ multithreading pointers c++11