为什么要这么做
因为通过pthread_create接口可以看到int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, (void*)(*start_rtn)(void*), void *arg);
线程调用的接口start_rtn
,是void *型,无法通过参数本身传递数据,而应该使用线程参数传递一个结构体或变量的指针来实现参数传递。所以,如果你构造很多线程参数,那么你就可以重用pthread_create接口来创建很多线程,使得每个线程针对不同数据执行相同操作;
例子
使用main线程创建2个线程,2个线程分别调用相同的打印函数,在控制台分别打印字符a字符b各30次:
/*================================================================
* Copyright (C) 2019. All rights reserved.
*
* 文件名称:pthread_para.c
* 创 建 者:
* 创建日期:2019年07月31日
* 描 述:
*
================================================================*/
#include <pthread.h>
#include <stdio.h>
/* print_func 参数 */
struct char_print_parms {
char character;/* 要输出的参数 */
int count; /* 要输出的次数 */
};
/* 根据运行函数的参数设置,打印输出规定的次数 */
void* char_print(void* parameters) {
struct char_print_parms* p = (struct char_print_parms*) parameters;
int i;
for (i = 0; i < p->count; i++) {
printf("%c\n", p->character);
}
return NULL;
}
/* 主程序 */
int main() {
pthread_t thread1_id;
pthread_t thread2_id;
struct char_print_parms thread1_args;
struct char_print_parms thread2_args;
/* 创建一个线程输出30次字符'a' */
thread1_args.character = 'a';
thread1_args.count = 30;
/* 创建一个线程输出30次字符'b' */
thread2_args.character = 'b';
thread2_args.count = 30;
pthread_create(&thread1_id, NULL, &char_print, &thread1_args);
pthread_create(&thread2_id, NULL, &char_print, &thread2_args);
/*为了保证main这个线程退出后,thread1_args和thread2_args释放会导致
* 其他线程没有变量空间,所以加入wait机制,等thread1_id和thread2_id线程结束后,在结束main线程
*/
pthread_join(thread1_id, NULL);
pthread_join(thread2_id, NULL);
return 0;
}
编译:# gcc -o pthread_para pthread_para.c -lpthread
执行:
可以看到,在上述代码的最后2行,加入了pthread_join接口,这个接口的作用是实现wait指定线程id,等它结束后,当前线程(即main线程)在结束,否则会导致在main内声明的局部变量被释放掉。
pthread_join
这里就顺带说下pthread_join接口,原型int pthread_join(pthread_t thread, void **retval);
pthread_t thread: thread:线程标识符,即线程ID,标识唯一线程。
void **retval:指向一个指向被连接线程的返回码的指针的指针。
return:0代表成功。 失败,返回的则是错误号。
pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的(默认创建都是joinable可结合的,还有一种状态叫detached分离的,设置线程分离状态的函数为pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate),第二个参数可选为
PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。这里就不继续扩展了)。