+ -
当前位置:首页 → 问答吧 → 关于向线程的启动函数传递参数的问题,请大虾赐教~~

关于向线程的启动函数传递参数的问题,请大虾赐教~~

时间:2010-09-08

来源:互联网

初学Linux 下的多线程编程,在网络上看到一篇老外写的tutorials:

关于向生成的线程的启动函数传递参数的问题:

1. 正确的传递方式
long *taskids[NUM_THREADS];

for(t=0; t<NUM_THREADS; t++)
{
     taskids[t] = (long *) malloc(sizeof(long));
     *taskids[t] = t;
     printf("Creating thread %ld\n", t);
     rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t]);
     ...
}
----> 这个很好理解,每个线程的启动函数的参数是一个单独分配出来的堆里面的long型数据。

2.不正确的传递方式
int rc;
long t;

for(t=0; t<NUM_THREADS; t++)
{
     printf("Creating thread %ld\n", t);
     rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
     ...
}
----> 这个也很好理解,每个线程的启动函数的参数是变量t的地址,那么很有可能在线程函数里面*t进行访问的时候,取到的值是t++之后的,所以这种方式是不正确的。

那么对于下面这种传递方式,书上说是正确的,我突然有点没转过弯来?为什么是正确的呢?

3.
int rc;
long t;

for(t=0; t<NUM_THREADS; t++)
{
   printf("Creating thread %ld\n", t);
   rc = pthread_create(&threads[t], NULL, PrintHello, (void *) t);
   ...
}

----> 传递的参数是变量t本身。
我的疑问是这样的:当t=0时,把t传给生成的自线程之后,因为多线程环境里,生成的线程是看得到初始线程的大部分内存的。那么当t++之后,在生成的线程里面,
访问t的时候不就很可能和上面的2.一样,得到的是t++之后的值么?

哦,我是不是忘记最基本的了,C里面的参数传递是传值的,传递变量t的时候,实际上是传递变量t的一份拷贝?

作者: pinecrane   发布时间: 2010-09-08

最后一个就是值传递而已,虽然强制转换了.到了线程里再转回来就是了

作者: liwangli1983   发布时间: 2010-09-08

感谢2L的指导。谢谢了。
多线程固然是快。但是因为每个线程都能看到同样一份内容。所以有点时候让人防不胜防啊。
不知道在商业级应用里,除了做OS,RDBMS这些活之外,用多线程的时候多不多?
毕竟同多进程相比,要考虑同步,很多东西。

作者: pinecrane   发布时间: 2010-09-08

多线程使用很多的,毕竟传递数据方便呀

作者: hellioncu   发布时间: 2010-09-08

相关阅读 更多

热门下载

更多