由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个C++编译器如何处理函数内的static 变量
相关主题
关于线程读写全局变量的问题请问多个线程同时访问同一个内存地址会不会使得程序变慢
问一下可能性,MingW生成的DLL和MSVC生成的DLL两个线程同步线程共享变量问题,搞不懂。
用volatile退出线程对不对?(C++)Java的多线程的一般问题
有关objec access path的问题重新学习Java Thread的Field变量与Thread Local
请问一个多线程与volatile关键字的问题。Bihai,你就用atmoic完事了
Dao语言2.0第一个测试版发布了!一个耗时函数如何响应外部事件?
关于多线程编程的一个问题[合集] 忽然发现VC里同一线程的消息函数是无法调用另一个消息函数的...
question about volatile variable on multiple cores弱问:C#定义的class里面直接new出来的成员存在了哪里?
相关话题的讨论汇总
话题: 线程话题: static话题: 编译器话题: 值应话题: 变量
进入Programming版参与讨论
1 (共1页)
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的回答要好得多。谢谢各位
1 (共1页)
进入Programming版参与讨论
相关主题
弱问:C#定义的class里面直接new出来的成员存在了哪里?请问一个多线程与volatile关键字的问题。
关于const和volatile修饰变量或指针的问题Dao语言2.0第一个测试版发布了!
怎样提高C#计算程序的performance?关于多线程编程的一个问题
VC++线程问题question about volatile variable on multiple cores
关于线程读写全局变量的问题请问多个线程同时访问同一个内存地址会不会使得程序变慢
问一下可能性,MingW生成的DLL和MSVC生成的DLL两个线程同步线程共享变量问题,搞不懂。
用volatile退出线程对不对?(C++)Java的多线程的一般问题
有关objec access path的问题重新学习Java Thread的Field变量与Thread Local
相关话题的讨论汇总
话题: 线程话题: static话题: 编译器话题: 值应话题: 变量