【01_Linux线程的使用】

创建和停止

创建

接口:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
参数说明:(四个参数都是指针类型)
thread:线程标识符
attr:线程属性,可以为NULL(用来标明线程的状态joinable和detach)
star_routine:函数指针,保存线程入口函数的地址
arg:给线程入口函数传参(一般使用全局变量或者堆上创建的变量)

返回值:0代表创建成功,其他值代表创建失败

停止

三种方式:
1.入口函数执行return;,直接退出返回
2.线程中调用pthread_exit(NULL)
void pthread_exit(void *retval);
参数:retval是返回信息,”临终遗言“ 能够被等待该线程结束的线程接收到 该变量同样不能使用临时变量,最好使用常量
3.将指定的线程取消,同样可以停止对应线程,某线程内取消其他线程
int pthread_cancel(pthread_t thread);
thread:线程标识符

状态

线程的状态和整个执行过程不相关,只是代表线程结束时,是否释放资源。
1.分离状态:detach 线程结束,自动释放资源
2.可连接状态:joinable 线程结束,需要使用pthread_join()函数连接该函数释放资源,否则会一直占用资源不释放

创建前:可以在创建线程之前,初始化线程的属性变量:pthread_attr_t
pthread_attr_init(&thread_attr);//线程属性初始化,默认是detach状态
pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_JOINABLE);设置线程状态属性
运行时:
thread_id=pthread_self()//获得线程自身的线程标识号
pthread_detach(thread_id)//可以是线程本身也可以是其他线程使指定线程转换为可分离状态

pthread_join函数
函数定义: int pthread_join(pthread_t thread, void **retval);
pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
参数 :thread: 线程标识符,即线程ID,标识唯一线程。retval: 用户定义的指针,用来存储被等待线程的返回值,实际上就是使用pthread_exit()函数返回的值,若不调用该函数也会返回一些值。
返回值 : 0代表成功。 失败,返回的则是错误号。

代码示例

qq.h

#ifndef QQ_H
#define QQ_H


typedef struct{
    int a;
    int b;
    int c;
}Value;

void* add(void* a);

#endif // QQ_H

qq.c

#include "qq.h"
#include<pthread.h>
#include<stdlib.h>
#include<string.h>

void* add(void* a)
{
    Value *x=(Value*)a;
    x->c=x->a+x->b;
    
    char *r=(char*)malloc(sizeof(char)*10);
    strcpy(r,"return;");
    pthread_exit(r);//线程退出并返回一些值
}

main.c

#include <stdio.h>
#include<pthread.h>
#include <unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include "qq.h"
int main()
{
    Value *v=(Value*)malloc(sizeof(Value));//初始化结构体,线程传入参数
    scanf("%d%d", &(v->a),&(v->b));//经过尝试发现占位符旁边不能有其他字符,否则运行会出问题,好像是因为编译器是C++11的问题
    /*v->a=3;
    v->b=4;
    v->c=0;*/

    pthread_t p1;//初始化线程id
    pthread_attr_t thread_attr;//线程属性
    pthread_attr_init(&thread_attr);//线程属性初始化
    //pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED);//线程分离状态,不用等待线程结束,自动释放资源
    pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_JOINABLE);//线程连接状态,需要等待线程结束,释放资源(pthread_join--阻塞线程,等待释放资源)
    if(pthread_create(&p1,&thread_attr,add,v))
    {
        printf("创建线程失败!!!\n");
    }
    printf("p1 = %d\n",p1);
    
    void *result;//接收线程返回值指针
    //char *result;//接收线程返回值指针
    
    //sleep(1);//主线程延时等待子线程执行完毕,但是需要花费大量时间
    //pthread_detach(p1);//使子线程在执行过程中改变状态,不会阻塞主线程,子线程结束后可自行释放资源
    pthread_join(p1,&result);//等待线程执行结束,再输出c的值,需要注意的是子线程必须是joinable状态,否则不会阻塞主线程,输出的值将不是a+b的值
    
    printf("a+b= %d\n",v->c);
    printf("result=%s",(char*)result);
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月光在发光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值