linux如何为线程提供多个参数,Linux多线程编程并传递多个参数实例

转自: http://www.cnblogs.com/blankqdb/articles/2651029.html

例子详细解析:

一. pthread_create()与pthread_join()函数

1 #include

2 intpthread_join(pthread_t thread,3 void **retval);

1. pthread_join函数作用

pthread_join函数作用是在一个线程中以阻塞的方式等待另一个线程(线程标识符为thread)的退出。如果等待的进程已经结束,那么该函数会立即返回。

retval是用户定义的指针,用来存储被等待线程的返回值。

返回值: 0 -- 成功,失败 -- 错误号errno

2. pthread_join的应用

使一个线程等待另一个线程的结束

代码中如果没有pthread_join主线程会很快结束,从而从而合整个进程线束,从而使创建的线程没有机会执行就结束了,在主线程加入pthread_join后,主线程会阻塞等待直到(被等待的)线程结束后,主线程自己才结束,从而使创建的线程有机会执行

3. 一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用 pthread_join 的线程则返回错误代码ESRCH。

1 #include

2 int pthread_create(pthread_t *thread,3 const pthread_attr_t *attr,4 void *(*start_routine) (void *),5 void *arg);

1. pthread_create函数的作用

创建一个线程,成功时返回0,错误时返回errno。

thread:被创建线程的标识符,pthread_join使用这个标识符来等待该线程的结束。

attr:     设置线程的属性,可以为NULL

第三个参数是线程函数的入口地址

arg:      传递给线程的参数,当要传递给线程的参数有多个时,可以使用结构体.

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

#ifdef HAVE_CONFIG_H

#include

#endif#include#include#include#include

//参数结构体

structargument

{intnum;char string[30];

};//声明两个线程函数

void *thread1_func( void *);void *thread2_func( void *);int main(int argc, char *argv[])

{//定义两个线程标识符

pthread_t thread1, thread2;//定义用来接收两个线程退出后的返回值,用作pthread_join的第二个参数

void *thread1_return, *thread2_return;//传递的参数结构体

structargument arg1, arg2;inti;int wait_thread_end; //判断线程退出成功与否//参数结构体值初始化

arg1.num = 1949;

strcpy( arg1.string, "中华人民共和国");

arg2.num= 2012;

strcpy( arg2.string, "建国63周年");//创建两个线程

pthread_create(&thread1, NULL, thread1_func, (void*)&arg1 );

pthread_create(&thread2, NULL, thread2_func, (void*)&arg2 );for( i = 0; i < 2; i++)

{

printf("我是最初的进程!\n");

sleep(2); //主统线程睡眠,调用其他线程

}//等待第一个线程退出,并接收它的返回值(返回值存储在thread1_return)

wait_thread_end = pthread_join( thread1, &thread1_return );if( wait_thread_end != 0)

{

printf("调用 pthread_join 获取线程1的返回值出现错误!\n");

}else{

printf("调用 pthread_join 成功!线程1退出后的返回值是 %d\n", (int)thread1_return);

}//等待第二个线程退出,并接收它的返回值(返回值存储在thread2_return)

wait_thread_end = pthread_join( thread2, &thread2_return);if( wait_thread_end != 0)

{

printf("调用 pthread_join 获取线程2的返回值出现错误!\n");

}else{

printf("调用 pthread_join 成功!线程2退出后的返回值是 %d\n",(int)thread2_return );

}returnEXIT_SUCCESS;

}/**

*线程1函数实现*/

void *thread1_func( void *arg )

{inti;struct argument *arg_thread1; //接收传递过来的参数结构体

arg_thread1= ( struct argument *)arg;for( i = 0; i < 3; i++)

{

printf("我来自线程1,传递给我的参数是 %d, %s\n", arg_thread1->num, arg_thread1->string);

sleep(2); //投入睡眠,调用其它线程

}return (void *)123;

}void *thread2_func( void *arg )

{inti;struct argument *arg_thread2; //接收传递过来的参数结构体

arg_thread2= ( struct argument *)arg;for( i = 0; i < 3; i++)

{

printf("我来自线程2,传递给我的参数是 %d, %s\n", arg_thread2->num, arg_thread2->string);

sleep(2); //投入睡眠,调用其它线程

}return (void *)456;

}

0818b9ca8b590ca3270a3433284dd417.png

例子中要请注意的地方:

void *thread1_func( void *arg )

{

...

return (void*)123;

}

void *thread2_func( void *arg )

{

...

return (void*)456;

}

1. 在线程函数中thread1_func()和thread2_func()中,最后一句return语句中,对返回的值要进行类型转换(转换成(void *)),返回值的类型要与线程函数的声明和定义的返回值类型一致。

2.  两个线程函数的返回值均为一个指针(把一个整数转换成(void*)返回)。该指针存储在pthread_join()的第三个参数中,在这两个函数中等价于

&thread1_return = thread1_func((void*)&arg1);

&thread2_return = thread2_func((void*)&arg2);

其中,&thread1_return是pthread_join的第二个参数,在前面函数解析中说过,pthread_join(phtread_t thread, void **retval)函数的第二个参数retval可以存储线程的返回值。该返回值直接存储在&thread1_return和&thread2_return,此时thread1_return和thread2_return值就是线程1和线程2函数的返回值(void *)类型。所以(int)thread1_return和(int)thread2_return就是该函数的返回值内容。由定义(void *thread1_return, *thread2_return)可以看出,thread1_return和thread2_return中两个指针,也就是说,这两个指针所存储的地址已经被两个线程的返回值所覆盖。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值