创建和停止
创建
接口: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;
}