Linux 如何在线程调用函数时传入参数呢?

发布于 2024-10-02 17:14:56 字数 3196 浏览 8 评论 0

先看下面修改的代码,传入线程编号作为参数:

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

愿与i

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

xu362930323

文章 0 评论 0

缱倦旧时光

文章 0 评论 0

qq_eXruk9

文章 0 评论 0

遂心如意

文章 0 评论 0

guojiayue1

文章 0 评论 0

愿与i

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文