线程与进程相比的有点:
- 系统资源消耗低
- 速度快
- 线程间数据共享比进程间容易
#include <pthread.h>
#include <unistd.h>
int pthread_create(pthread_t *thread,pthread_attr_t * attr,void* (*start_routine)(void*),void* arg);//创建线程
int pthread_join(pthread_t thread,void** threadReturn);//等线程运行结束,阻塞函数
void pthread_exit(void* retval);//线程结束时返回参数,可以被pthread_join捕获
pthread_create()
int pthread_create(pthread_t *thread, pthread_attr_t * attr,
void* (*start_routine)(void*), void* arg);
线程创建成功时,函数返回0,若不为0则说明线程创建失败。
- thread用于标识一个线程
- attr线程属性
- start_routine线程运行的单元
- arg 线程运行时传入的参数
pthread_join()
int pthread_join(pthread_t thread,void** threadReturn);
用来等一个线程结束,threadReturn线程返回值指针
pthread_exit()
void pthread_exit(void* retval);
线程调用的函数如果不需要返回值,则可以直接等其运行结束,需要返回值调用该函数实现
线程属性
1.线程的属性结构
线程的属性结构为pthread_attr_t,在头文件<pthreadtypes.h>中定义。
线程属性初始化函数pthread_attr_init(),必须在pthread_create()之前调用。
若使用默认属性则调用pthread_create()时,attr置为NULL。
2.线程的优先级
由两个函数控制
#include <sched.h>
int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);//设置
int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);//获取
3.线程的绑定状态
int pthread_attr_setscope(pthread_attr_t *attr,int scope);//设置绑定属性
- attr指向属性结构的指针
- scope绑定类型两种取值,PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的)。
4.线程的分离状态
线程的分离状态决定线程的终止方法。线程的分离状态有分离线程和非分离线程两种。
线程建立时没用设置属性则默认为非分离状态,此时需要等待创建线程的接触当pthread_join()返回时,线程才算终止,并释放资源。
int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);//
- PTHREAD_CREATE_DETACHED设置分离线程
- 默认为非分离线程PTHREAD_CREATE_JOINABLE
示例
//线程
#include<stdlib.h>
#include<stdio.h>
#include <pthread.h>
#include <unistd.h>
void* pthreadRuning(void* arg)
{
int* running = static_cast<int*>(arg);
printf("thread Init OK\n");
int n = 0;
while(* running )
{
printf("thread is running ,%d\n",n);
n++;
// usleep(1);
}
printf("exit\n");
// int ret = 10;
*running = 10;
pthread_exit(static_cast<void*>(running ));
}
#include <sched.h>
void PthreadTest()
{//线程测试程序
pthread_attr_t attr;//线程属性
sched_param sch;
pthread_attr_init(&attr);//初始化属性设置,需要在creat之前
pthread_attr_getschedparam(&attr,&sch);//获得当前线程的属性设置
sch.sched_priority = 256;//设置线程优先级为256
pthread_attr_setschedparam(&attr,&sch);//设置属性
//pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);//设置绑定属性
//pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//设置分离线程,默认为非分离线程PTHREAD_CREATE_JOINABLE
pthread_t ptid;
int val = 1;
int ret = pthread_create(&ptid,&attr,pthreadRuning,&val);//建立线程属性如上
// int ret = pthread_create(&ptid,NULL,pthreadRuning,&val);//默认的属性的线程
if(0 != ret)
{
printf("pthread creat err\n");
return ;
}
int sleeptime = 8;
printf("usleep %d us\n",sleeptime);
usleep(sleeptime);
val = 0;
void* pthreadRet = nullptr;
pthread_join(ptid,&pthreadRet);
printf("pthread ret:%d\n",*static_cast<int*>(pthreadRet));
return;
}
注
Linux网络编程(第二版) 第四章 读书笔记