关于向线程的启动函数传递参数的问题,请大虾赐教~~
时间: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的一份拷贝?
关于向生成的线程的启动函数传递参数的问题:
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这些活之外,用多线程的时候多不多?
毕竟同多进程相比,要考虑同步,很多东西。

多线程固然是快。但是因为每个线程都能看到同样一份内容。所以有点时候让人防不胜防啊。
不知道在商业级应用里,除了做OS,RDBMS这些活之外,用多线程的时候多不多?
毕竟同多进程相比,要考虑同步,很多东西。
作者: pinecrane 发布时间: 2010-09-08
多线程使用很多的,毕竟传递数据方便呀
作者: hellioncu 发布时间: 2010-09-08
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28