linux下的线程

线程与进程相比的有点:

  • 系统资源消耗低
  • 速度快
  • 线程间数据共享比进程间容易
#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网络编程(第二版) 第四章 读书笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值