1

我曾经遇到过麻烦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 是这两个操作系统的编译器,为什么一个系统会有这样的错误?它使像我这样的新手程序员感到困惑。如果它不是错误,任何人都可以向我解释为什么会发生这种情况?

4

3 回答 3

4

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

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

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

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

于 2012-04-05T11:23:11.653 回答
3

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

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

奖金相关答案 -可以在其范围之外访问局部变量的内存吗?

于 2012-04-05T11:23:50.457 回答
1

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

于 2012-04-05T11:24:36.723 回答