线程和地址空间

时间:2017-03-20 11:43:41

标签: multithreading process stack memory-address

我有以下程序:

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()外部定义)?

任何帮助将不胜感激! 谢谢: - )

1 个答案:

答案 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()外部定义)?

一。这是一个全局变量。