我试图理解TCB中的细节(线程控制块以及每线程状态和共享状态之间的差异。我的书有自己的pthread实现,所以它给出了一个这个迷你C的例子程序(我没有整理出来的东西)
#include "thread.h"
static void go(int n);
static thread_t threads[NTHREADS];
#define NTHREADS 10
int main(int argh, char **argv) {
int i;
long exitValue;
for (i = 0; i < NTHREADS; i++) {
thread_create(&threads[i]), &go, i);
}
for (i = 0; i < NTHREADS; i++) {
exitValue = thread_join(threads[i]);
}
printf("Main thread done".\n);
return 0;
}
void go(int n) {
printf("Hello from thread %d\n", n);
thread_exit(100 + n);
}
变量i
和exitValue
(在main()
函数中)的例子是什么?他们不是共享状态,因为他们不是全局变量,但我不确定他们是否也是每个线程状态。在创建每个线程时,i
用作go函数的参数,所以我对它有点困惑。 exitValue的范围仅限于main()
,因此它似乎只会存储在进程中。堆。作为n
的参数的int void go()
将是每线程变量,因为它的值对于每个线程是独立的。我不认为我完全理解这些概念,所以任何帮助将不胜感激!谢谢!
答案 0 :(得分:0)
它们是自动存储的对象,随便称为“局部变量”,尽管后者含糊不清,因为C和C ++都允许具有本地范围的对象但仅限于通过static
关键字获得一个全局实例。
答案 1 :(得分:0)
示例程序中的所有变量都是automatic variables。每当其中一个进入范围存储时,它就会被分配,当它离开其范围时,它就不再有效。这个概念与变量是否共享无关。
变量的范围是指它在程序中的生命周期(以及它如何被访问的规则)。在您的程序中,变量i
和exitValue
的范围限定为main
函数。通常,编译器将在堆栈上分配空间,用于存储这些变量的值。
函数n
中的变量go
是函数的参数,因此它还充当函数go
中的局部变量。因此,每次执行go
时,编译器将在堆栈帧上为变量n
分配空间(尽管编译器可能能够执行优化以将局部变量保留在寄存器中而不是实际分配堆栈空间)。但是,因为参数n
将使用它调用的任何值(其实际参数)进行初始化。
为了使这更具体,这是在第一个循环完成2次迭代之后程序中的变量的值(假设生成的线程尚未完成执行)。
Main thread: i = 2, exitValue = 0
Thread 0: n = 0
Thread 1: n = 1
需要注意的是,变量n
有多个独立副本。 n
执行i
时thread_create
获取值的副本,但i
和n
的值在此之后是独立的。< / p>
最后,我不确定语句exitValue = thread_join(threads[i]);
应该发生什么,因为这是pthreads的变体。但可能发生的是,当另一个线程调用thread_join
时,它会使值可用。因此,通过这种方式,您可以在线程之间获得一些数据共享,但共享由thread_join
命令同步。