f**********w 发帖数: 93 | 1 void foo()
{ static int i;
// ......
}
假设我有这样一个static变量,如果有两个线程按如下时间顺序调用foo(),
T0:第一个线程把i设为3,
T1:第二个把i设为5,
T2:第一个线程打印i,i的值应该是3,然后两个线程退出foo(),
T3:现在i的值应该是多少?
这个过程编译器是如何对i进行操作的?
请指教 |
s******e 发帖数: 431 | 2 << T2:第一个线程打印i,i的值应该是3,然后两个线程退出foo(),
应该打印5. 你可以想象static 相当于全局变量。 |
f**********w 发帖数: 93 | 3 我也是这样说的,但面试的人说应该是3。我也没有其他的问题答错,就被拒了。 |
m*****e 发帖数: 4193 | 4 It depends on compiler optimization. The interviewer fails.
【在 f**********w 的大作中提到】 : 我也是这样说的,但面试的人说应该是3。我也没有其他的问题答错,就被拒了。
|
u****u 发帖数: 229 | 5 其实这个问题根本没有一定的答案的,关键就看你怎么处理各种操作,所以你要分析出什
么情况下会出什么结果,如果你咬定说是一个结果,不管是什么,都说明你对多线程没有
什么概念.一般你不需要知道很复杂的概念,但是至少你要能看到这种东西就知道提高警
惕,否则就等于闭着眼睛开车,天知道什么时候会出问题.
另外,"这个过程编译器是如何对i进行操作的"这种话是很有歧义的,如果面试的人听到
类似的话,很容易的就怀疑你到底对一些基本概念是不是真的理解.
【在 f**********w 的大作中提到】 : void foo() : { static int i; : // ...... : } : 假设我有这样一个static变量,如果有两个线程按如下时间顺序调用foo(), : T0:第一个线程把i设为3, : T1:第二个把i设为5, : T2:第一个线程打印i,i的值应该是3,然后两个线程退出foo(), : T3:现在i的值应该是多少? : 这个过程编译器是如何对i进行操作的?
|
o*******0 发帖数: 699 | 6 编译器怎么会决定 runtime 变量值?
T2 怎么可能是3?又不是stack variable |
f*******y 发帖数: 55 | 7 这篇说的好像比较详细了。
http://www.codeguru.com/cpp/misc/misc/assemblylanguage/article.php/c12897
各位看看还有什么其他的可能问题?
针对这个题干
" T2:第一个线程打印i,i的值应该是3,然后两个线程退出foo(),"
如果这个打印的值是3,那么是不是说明T1的i=5被因为没有互锁而覆盖了?所以i应该
还是3。 然后和面试官说:如果team中有人这么写程序,这个team就不值得来了. 这种
问题擦起屁股来要气死人的。
说与编译器优化有关的老大,是不是编译器优化会给这样的变量加锁呢? |
d*********8 发帖数: 2192 | 8 面试时切忌只回答答案。最重要的是你的理由。即使答案错了,理由讲清楚了,表明自
己概念清楚,也不会明显失分。
首先表明态度,绝对不应该在要求THREAD SAFE的函数里写这样的代码。
然后说应该有LOCK,以及VOLATILE声明。
第三说,最好是用全局变量,这样别人调用的时候知道会有锁,会更加小心。
至于最后的答案。由于没有volatile编译器如果做了优化的话,T2打印3是有可能的。
因为还在CPU CACHE里。
如果楼主坚持打印3是错误的,表明不理解volatile,FAIL也正常。 |
v*****u 发帖数: 1796 | 9 admire this answer!
【在 d*********8 的大作中提到】 : 面试时切忌只回答答案。最重要的是你的理由。即使答案错了,理由讲清楚了,表明自 : 己概念清楚,也不会明显失分。 : 首先表明态度,绝对不应该在要求THREAD SAFE的函数里写这样的代码。 : 然后说应该有LOCK,以及VOLATILE声明。 : 第三说,最好是用全局变量,这样别人调用的时候知道会有锁,会更加小心。 : 至于最后的答案。由于没有volatile编译器如果做了优化的话,T2打印3是有可能的。 : 因为还在CPU CACHE里。 : 如果楼主坚持打印3是错误的,表明不理解volatile,FAIL也正常。
|
f**********w 发帖数: 93 | 10 我当时是这样回答的,static变量存在内存的static data segment,虽然每个线程有自
己的local stack,但应该共享static variable,所以打印5。
当然drifter2008的回答要好得多。谢谢各位 |