【发布时间】:2016-05-07 09:23:03
【问题描述】:
我在一个线程对象中有一个函数,这个函数接受几个参数,我不知道当很多线程尝试使用这个函数时,这个线程是否会改变另一个线程的参数值?
我可以使用锁,但是在分配了参数之后。 如果参数存储在堆栈中,我猜它们将存在于每个线程堆栈中,但如果它们存在于堆中,如何避免线程更改另一个线程的函数参数?
【问题讨论】:
-
您能再说明一下您的担忧吗?我们是在讨论函数内部的 locals,还是在调用函数时将参数传递给 to 函数?
-
我不确定您是否知道,但函数的不同执行不会“共享”对相同参数的引用(除非您使用引用相同的参数显式调用它们)。即使对于单线程程序也是如此,并且是允许递归函数正确运行所必需的。例如,如果调用堆栈中较低的 x 值覆盖了调用堆栈中较高的 x 值,
def fib(x): return 1 if x <= 1 else fib(x-1) + fib(x-2)会给出奇怪的结果。 -
@MartijnPieters 我说的是我在调用函数时传递给函数的参数。
-
@Kevin 我不明白这个“(除非你用引用相同的参数明确地调用它们)”你能解释更多吗?谢谢。最后你告诉我,不管是单线程函数调用还是跨多个线程共享的函数调用,每个调用都有自己的内存空间来存放参数值?
-
@Lben:我仍然不确定您希望在哪里出现竞争条件?没有任何可变对象可以免受其他线程的突变。您是否担心两次调用同一个函数会混淆参数?
标签: python multithreading memory heap-memory stack-memory