给线程传递参数+pthread_join理解

本文介绍了在多线程编程中如何通过线程参数传递来实现不同线程执行相同操作但处理不同数据。通过示例展示了如何创建两个线程,每个线程调用同一打印函数并打印不同字符。同时,解释了pthread_join的作用,它是用来等待指定线程结束,确保局部变量不会提前释放。pthread_join函数的使用和返回值也进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要这么做

因为通过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(非分离线程)。这里就不继续扩展了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值