2014-10-20 38 views
0

我对C中的多线程是新手,想知道如何在线程间共享函数中声明的共享(非全局和非静态)变量。我知道,我们可以像线程如何知道共享变量的地址

a = (int *)malloc(sizeof(int)); 

声明像

int a; 

或动态的既简单变量共享data.But,目前尚不清楚什么对我是如何在各种情况下的编译器行为?

1)它是否将在其线程堆栈内创建的变量的地址赋予其他线程?

2)如何动态分配变量?它的指针是否广播?或者指针保存在.DATA或.BSS中的某个地方?

在此先感谢

+0

我不是一个熟练的人,但我认为在单个OS进程中,所有线程共享相同的内存映射。在一个线程上分配的内存不在不同的位置,或者以不同的方式进行管理,从分配在任何其他线程上的内存中,对吗?我意识到需要做的唯一的区别是单线程公寓(STA),其中需要一些限制来控制哪些函数被允许操纵在这些线程中创建的资源(窗口,图形对象等)在另一个... – 2014-10-20 16:22:30

+0

每个线程都有自己的堆栈,但共享堆。 – user3684042 2014-10-20 16:28:38

+0

但是,不是每个线程的堆栈仍然是由OS发布到所有线程驻留的进程所在的同一内存映射的一部分吗?即如果一个线程具有来自另一个线程的变量的虚拟地址,则它不需要对操作系统进行“thunk”以获得实际的物理地址来访问它。 – 2014-10-20 16:35:10

回答

1

如何声明你的变量以及它如何在一个线程处理是不是编译器关心。决定如何分配它是你的工作。

例如,如果您已在堆栈中分配了int a,则需要确保该变量在任何访问该线程的线程的生命周期内都能存活。这通常意味着在变量超出范围之前加入任何线程。

如果你在堆上分配变量,那么你的线程可以访问这个变量,而不必担心内存超出了范围。但是,您需要决定如何释放由malloc分配的内存。一个线程将需要成为内存的“所有者”,并调用free来对付它,否则会产生内存泄漏。

将指针传递给线程将取决于您使用的平台和线程库。但是,它们都允许您传递某种参数,通常为void*例如,pthread_create的第4个参数允许您将指针传递到您的线程函数中。

+0

谢谢。但是,我已经知道高级语言会发生什么。我在寻找的是共享(非静态和非全局)变量的位置是如何被其他线程知道的。 – user3684042 2014-10-20 16:26:10

+0

@ user3684042 - 够公平的。我已经为答案添加了更多信息。 – Sean 2014-10-20 16:29:35