线程中的每线程状态与共享状态

时间:2015-11-13 03:00:06

标签: c multithreading pthreads

我试图理解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);
}

变量iexitValue(在main()函数中)的例子是什么?他们不是共享状态,因为他们不是全局变量,但我不确定他们是否也是每个线程状态。在创建每个线程时,i用作go函数的参数,所以我对它有点困惑。 exitValue的范围仅限于main(),因此它似乎只会存储在进程中。堆。作为n的参数的int void go()将是每线程变量,因为它的值对于每个线程是独立的。我不认为我完全理解这些概念,所以任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:0)

它们是自动存储的对象,随便称为“局部变量”,尽管后者含糊不清,因为C和C ++都允许具有本地范围的对象但仅限于通过static关键字获得一个全局实例。

答案 1 :(得分:0)

简答

示例程序中的所有变量都是automatic variables。每当其中一个进入范围存储时,它就会被分配,当它离开其范围时,它就不再有效。这个概念与变量是否共享无关。

更长的答案

变量的范围是指它在程序中的生命周期(以及它如何被访问的规则)。在您的程序中,变量iexitValue的范围限定为main函数。通常,编译器将在堆栈上分配空间,用于存储这些变量的值。

函数n中的变量go是函数的参数,因此它还充当函数go中的局部变量。因此,每次执行go时,编译器将在堆栈帧上为变量n分配空间(尽管编译器可能能够执行优化以将局部变量保留在寄存器中而不是实际分配堆栈空间)。但是,因为参数n将使用它调用的任何值(其实际参数)进行初始化。

为了使这更具体,这是在第一个循环完成2次迭代之后程序中的变量的值(假设生成的线程尚未完成执行)。

Main thread: i = 2, exitValue = 0
Thread 0:    n = 0
Thread 1:    n = 1

需要注意的是,变量n有多个独立副本。 n执行ithread_create获取值的副本,但in的值在此之后是独立的。< / p>

最后,我不确定语句exitValue = thread_join(threads[i]);应该发生什么,因为这是pthreads的变体。但可能发生的是,当另一个线程调用thread_join时,它会使值可用。因此,通过这种方式,您可以在线程之间获得一些数据共享,但共享由thread_join命令同步。