我有以下程序:
char **ptr; /* global */
int main()
{
int i;
pthread_t tid;
char *msgs[N] = {
"Hello from foo",
"Hello from bar"
};
ptr = msgs;
for (i = 0; i < 2; i++)
Pthread_create(&tid,
NULL,
thread,
(void *)i);
Pthread_exit(NULL);
}
/* thread routine */
void *thread(void *vargp)
{
int myid = (int)vargp;
static int svar = myid;
f1 (myid, svar);
printf("[%d]: %s (svar=%d)\n",
myid, ptr[myid], ++svar);
}
/* subroutine f1 */
void f1(id, id2)
{
If (id == id2){
something();
}else{
somethingelse();
}
}
我有几个问题:
1)thread()存储在“地址空间”中的哪个位置?
2)我们拥有变量“myid”的副本数量以及它们的位置 存储
3)我们拥有变量“svar”的副本数量以及存储位置?
4)线程1调用f1()子程序(something()或somethingelse())之后 将被称为下一个?
5)我们有多少份ptr(在main()外部定义)?
任何帮助将不胜感激! 谢谢: - )
答案 0 :(得分:0)
1)thread()存储在“地址空间”中的哪个位置?
编译器/链接器/操作系统决定放置它的位置。通常是某种形式的“代码段”。每个模块通常有一个,但可能会有更多,具体取决于编译器/链接器/ OS配置。
2)我们拥有变量“myid”的副本数量和位置 他们存储了吗?
2份。您创建了2个线程,每个线程在其堆栈上都有自己的DataTable
副本。
3)我们拥有变量“svar”的副本数量以及存储位置?
myid
有1份副本;它是一个svar
变量。它将存储在全局数据段中。这可能与在全局范围内声明的变量相同,也可能是独立的,具体取决于编译器/链接器/ OS配置。
4)在线程1调用f1()之后,子例程(something()或somethingelse())&gt;将被称为下一个?
执行static
行的第一个线程将设置static int svar=myid
;第二个线程将保持svar
不变(假设C ++ 11样式的线程安全静态---在旧版本的MSVC上,或者禁用线程安全静态的gcc,这是一个数据争用和未定义的行为)
这可能是线程1或线程2.无论哪个线程是“第一个”,它都将调用svar
,而另一个线程将调用something
。
5)我们有多少份ptr(在main()外部定义)?
一。这是一个全局变量。