【问题标题】:pthread_exit() with address of local variable sometimes works?带有局部变量地址的 pthread_exit() 有时可以工作吗?
【发布时间】:2012-04-19 03:09:14
【问题描述】:

我曾经在pthread_exit() 上遇到过麻烦。我知道没有办法像这样使用pthread_exit()

pthread_exit(&some_local_variable);

我们总是需要像这样使用 pthread_exit():

pthread_exit("Thread Exit Message or something necessary information");

我曾经为测试目的编写了一个简单的程序。 我分别为两个整数的加法、减法、乘法和除法做了四个线程函数。然后在四个不同的线程上执行这些操作时,我尝试通过pthread_exit()返回操作结果。我的意思是这样的:

pthread_exit(&add_result);

当我在 CentOS 6 中运行代码时,我得到了想要的结果(即来自所有线程的垃圾值),因为 pthread_exit() 不能这样使用。但是,我糊涂了。因为这是我第一次在 Ubuntu 11.10 中运行该代码,并从三个线程中获得了三个绝对正确的结果(操作的正确结果)和一个线程中的垃圾值。这让我很困惑,因为为什么三个线程给出了正确的操作结果?

此外,我为这些线程使用了不同的睡眠时间。我发现睡眠时间最少的线程给出了垃圾值。

gcc 是这两个操作系统的编译器,为什么一个系统会有这样的错误? 它使像我这样的新手程序员感到困惑。如果不是错误,谁能向我解释为什么会这样?

【问题讨论】:

  • 某事有效并不意味着它是正确的...... :)
  • 只有一个音符。您不必总是返回字符串常量。例如,您可以在malloc () 一些内存中存储一​​个值,然后返回malloc'd 指针。重点是:返回线程退出后仍然有效的any地址。
  • 谢谢。我之前应该得到的。

标签: c linux multithreading ubuntu centos


【解决方案1】:

pthread_exit(foo) 的唯一要求是,foo 指向的东西足够长。局部变量不会,malloc'ed 内存会。

【讨论】:

    【解决方案2】:

    pthread_exit 只需要一个指向void 的指针。如果您将本地变量的地址传递给线程,则有时该内存将被重用于其他用途。有时它仍然会在那里。无法保证在线程退出后,系统的某些部分会去确保它正在使用的所有内存都设置为垃圾值。

    这不是错误 - 系统正在按照您的要求进行操作。

    奖金相关答案 - Can a local variable's memory be accessed outside its scope?

    【讨论】:

    • 您可能还想提一下,您不仅可以获得正确的 OR 垃圾值,而且程序也可能崩溃(因为您访问了不应该访问的内存位置):即“未定义的行为” .
    【解决方案3】:

    我认为您的答案在pthread_exit doc 中。你说你返回了一个指向add_result的指针,这似乎是一个局部变量。

    这是可能回答的文档的引用:

    线程终止后,访问本地(auto)的结果 线程的变量未定义。因此, 对退出线程的局部变量的引用不应用于 pthread_exit() value_ptr 参数 价值。

    您可以使用线程函数的 void* 参数来使用结构,该结构应包含您的操作的实际结果。

    【讨论】:

    • 感谢您的回答。我不这么认为。但我主要关心的是为什么两个系统的行为不同。这不应该发生。或者如果发生,为什么?
    • 你在ubuntu系统上试过多次了吗?也许 1. 这取决于上下文 2. 取决于实现
    • 谢谢..我试了好几次。即使在我的办公室,我也在演示文稿中展示了它。可能是依赖于实现。当只使用一个线程时,我得到了想要的结果。但是当我使用四个时,我得到了说明。
    猜你喜欢
    • 2019-09-06
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2013-05-06
    • 2018-01-15
    • 2020-11-14
    相关资源
    最近更新 更多