【问题标题】:Per-thread state vs. shared state in threads每线程状态与线程中的共享状态
【发布时间】:2015-11-13 03:00:06
【问题描述】:

我试图了解 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(),因此看起来它只是存储在进程的堆栈中。作为 void go() 参数的 int n 将是每个线程的变量,因为它的值对于每个线程都是独立的。我不认为我完全理解这些概念,所以任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 在开始线程之旅之前,您应该非常熟悉堆栈、堆和程序数据之间的区别,以及它们的生命周期/使用情况。跨度>
  • 我不同意int n 参数是每个线程的变量。每次调用go。例如,如果 go 是递归的,则单个线程将具有 两个 不同的此类变量。

标签: c multithreading pthreads


【解决方案1】:

简答

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

更长的答案

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

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

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

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

需要注意的是变量n有多个独立的副本。并且n 在执行thread_create 时会获得i 中值的副本,但之后i 和n 的值是独立的。

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

【讨论】:

    【解决方案2】:

    它们是具有自动存储的对象,通常称为“局部变量”,尽管后者是模棱两可的,因为 C 和 C++ 都允许具有局部 作用域 的对象,但只有通过static 关键字拥有一个全局实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-22
      • 2010-12-15
      • 2012-05-10
      • 1970-01-01
      • 2010-11-24
      • 2015-02-08
      • 1970-01-01
      • 2018-04-19
      相关资源
      最近更新 更多