Linux 如何在线程调用函数时传入参数呢?
先看下面修改的代码,传入线程编号作为参数:
#include <iostream>
#include <pthread.h> //多线程相关操作头文件,可移植众多平台
using namespace std;
#define NUM_THREADS 5 //线程数
void* say_hello( void* args )
{
int i = *( (int*)args ); //对传入的参数进行强制类型转换,由无类型指针转变为整形指针,再用*读取其指向到内容
cout << "hello in " << i << endl;
return NULL;
} //函数返回的是函数指针,便于后面作为参数
int main()
{
pthread_t tids[NUM_THREADS]; //线程 id
cout << "hello in main.." << endl;
for( int i = 0; i < NUM_THREADS; ++i )
{
int ret = pthread_create( &tids[i], NULL, say_hello, (void*)&i ); //传入到参数必须强转为 void*类型,即无类型指针,&i 表示取 i 的地址,即指向 i 的指针
cout << "Current pthread id = " << tids[i] << endl; //用 tids 数组打印创建的进程 id 信息
if( ret != 0 ) //创建线程成功返回 0
{
cout << "pthread_create error:error_code=" << ret << endl;
}
}
pthread_exit( NULL ); //等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态
return 0;
}
测试结果:
jack@jack:~/coding/muti_thread$ ./pthread_chap2
hello in main..
Current pthread id = 3078458224
Current pthread id = 3070065520
hello in hello in 2
1
Current pthread id = hello in 2
3061672816
Current pthread id = 3053280112
hello in 4
Current pthread id = hello in 4
3044887408
显然不是想要的结果,调用顺序很乱,这是为什么呢?
这是因为多线程到缘故,主进程还没开始对 i 赋值,线程已经开始跑了…?
修改代码如下:
#include <iostream>
#include <pthread.h> //多线程相关操作头文件,可移植众多平台
using namespace std;
#define NUM_THREADS 5 //线程数
void* say_hello( void* args )
{
cout << "hello in thread " << *( (int *)args ) << endl;
return NULL;
} //函数返回的是函数指针,便于后面作为参数
int main()
{
pthread_t tids[NUM_THREADS]; //线程 id
int indexes[NUM_THREADS]; //用来保存 i 的值避免被修改
for( int i = 0; i < NUM_THREADS; ++i )
{
indexes[i] = i;
int ret = pthread_create( &tids[i], NULL, say_hello, (void*)&(indexes[i]) );
if( ret != 0 ) //创建线程成功返回 0
{
cout << "pthread_create error:error_code=" << ret << endl;
}
}
for( int i = 0; i < NUM_THREADS; ++i )
pthread_join( tids[i], NULL ); //pthread_join 用来等待一个线程的结束,是一个线程阻塞的函数
return 0;
}
测试结果:
jack@jack:~/coding/muti_thread$ ./pthread_chap3
hello in thread hello in thread hello in thread hello in thread hello in thread 30124
这是正常的吗?感觉还是有问题…待续
代码中如果没有 pthread_join 主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入 pthread_join 后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论