-1

我正在关注https://computing.llnl.gov/tutorials/pthreads中的多线程教程, 并尝试使用提供的一些代码。

我使用了这个源文件https://computing.llnl.gov/tutorials/pthreads/samples/hello.c 然后将它添加到主函数中:

   void * v;
   v = (void *)t;

并替换了这一行:

rc = pthread_create(threads+t, NULL, PrintHello, (void*)t);

这样:

rc = pthread_create(threads+t, NULL, PrintHello, v)

可以说(我知道这不是一个好的论点:)),输出应该保持不变..但这是新的输出:

In main: creating thread 0
In main: creating thread 1
Hello World! It's me, thread #140734232544832!
In main: creating thread 2
In main: creating thread 3
Hello World! It's me, thread #140734232544832!
In main: creating thread 4
Hello World! It's me, thread #140734232544832!
Hello World! It's me, thread #140734232544832!
Hello World! It's me, thread #140734232544832!

线程#是垃圾!

有人可以向我解释这里发生了什么吗?为什么输出会改变?

是不是因为 t 是按值传递并在传递给 PrintHello 时进行转换,而现在,在更改之后我试图传递指针并且该指针的地址被正确传递 - 该地址不包含 t 包含的值,因为是本地的吗?

有人可以确认/拒绝并修正我的理论吗?

4

1 回答 1

1

在您发表评论后,您需要从以下位置更改您的代码:

long t;
void* v;
v = (void *)t;
for(...)
  //stuff

至:

long t;
for(...) {
  void* v;
  v = (void*) t;
  //stuff
}

基本上,在前一种情况下发生的事情是 t 未初始化,因此其值未定义。然后将其复制到变量 v 中并传递给 pthread。如果它在 for 循环内,则 t 已被初始化。

于 2013-10-13T05:42:01.607 回答