Linux C/C++线程

35 篇文章 0 订阅
35 篇文章 0 订阅


一、线程是什么?

(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

二、线程创建

线程创建函数: int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>

void* callback(void* arg)
{
    printf("child thread...\n");
    printf("arg value:%d\n",*(int*)arg);
    return NULL;
}

int main()
{
    pthread_t tid;
    int num=10;
    //创建一个子线程
    int ret = pthread_create(&tid,NULL,callback,(void *)&num);

    if(ret!=0)
    {
        char* errstr = strerror(ret);
        printf("error:%s\n",errstr);
    }

    for(int i=0;i<5;i++)
    {
        printf("%d\n",i);
    }

    sleep(1);
    return 0;
}

三、线程终止

线程终止函数: void pthread_exit(void *retval);

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>

void* callback(void* arg)
{
    printf("child thread id:%ld\n",pthread_self());
    return NULL;//pthread_exit(NULL);
}

int main()
{
    //创建一个子进程
    pthread_t tid;
    int ret = pthread_create(&tid,NULL,callback,NULL);

    if(ret!=0)
    {
        char* errstr= strerror(ret);
        printf("error:%s\n",errstr);
    }

    //主线程
    for(int i=0;i<5;i++)
    {
        printf("%d\n",i);
    }

    printf("tid:%ld,man thread id:%ld\n",tid,pthread_self());

    //让主线程退出,当主线程退出时,不会影响其他正常运行的线程。
    pthread_exit(NULL);

    printf("main thread");

    return 0;
}

四、线程分离

线程分离函数: int pthread_detach(pthread_t thread);

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<unistd.h>
#include<string.h>

void* callback(void* arg)
{
   printf("child thread id: %ld\n",pthread_self()); 

}

int main()
{
    //创建一个子线程
    pthread_t tid;

    int ret = pthread_create(&tid,NULL,callback,NULL);
    if(ret!=0)
    {
        char* errstr=strerror(ret);
        printf("error1: %s\n",errstr);
    }

    //输出主线程和子线程的id
    printf("tid: %ld,main thread id: %ld\n",tid,pthread_self());

    //设置子线程分离,子线程分离后,子线程结束时对应的资源就不需要主线程释放
    ret = pthread_detach(tid);
    if(ret!=0)
    {
        char* errstr=strerror(ret);
        printf("error2: %s\n",errstr);
    }

    //设置分离后,对分离的子线程进行连接
    ret = pthread_join(tid,NULL);
     if(ret!=0)
    {
        char* errstr=strerror(ret);
        printf("error3: %s\n",errstr);
    }

    pthread_exit(NULL);


    return 0;
}

五、线程连接

线程连接函数: int pthread_join(pthread_t thread, void **retval);

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>

int value=10;

void* callback(void* arg)
{
    printf("child thread id:%ld\n",pthread_self());
   // sleep(3);
   // int value=10;//局部变量
    pthread_exit((void*)&value); //return (void*)&value;
}

int main()
{
    //创建一个子线程
    pthread_t tid;
    int ret = pthread_create(&tid,NULL,callback,NULL);

    if(ret!=0)
    {
        char* errstr=strerror(ret);
        printf("error:%s\n",errstr);
    }

    //主线程
    for(int i=0;i<5;i++)
    {
        printf("%d\n",i);
    }

    printf("tid :%ld,main thread id:%ld\n",tid,pthread_self());

    //主线程调用pthread_join()回收子线程的资源
    int* thread_retval;
    ret = pthread_join(tid,(void**)&thread_retval);
    if(ret!=0)
    {
        char* errstr=strerror(ret);
        printf("error:%s\n",errstr);
    }

    printf("exit data:%d\n",*thread_retval);


    printf("回收子线程资源成功!\n");

    pthread_exit(NULL);
    

    return 0;
}

六、线程属性

线程属性函数:

int pthread_attr_init(pthread_attr_t* attr);
-功能:初始化线程属性变量

int pthread_attr_destroy(pthread_attr_t *attr);
-功能:释放线程属性资源

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
-功能:获取线程分离的状态属性

int pthread_attr_getdetachstate(const pthread_attr_t *attr, int
*detachstate);
-功能:设置线程分离的状态属性

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>

void* callback(void* arg)
{
   printf("child thread id: %ld\n",pthread_self()); 

}

int main()
{
    //创建一个线程属性变量
    pthread_attr_t attr;
    //初始化属性变量
    pthread_attr_init(&attr);

    //设置属性
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

    //创建一个子线程
    pthread_t tid;

    int ret = pthread_create(&tid,&attr,callback,NULL);
    if(ret!=0)
    {
        char* errstr=strerror(ret);
        printf("error1: %s\n",errstr);
    }

    //获取线程栈的大小
    size_t size;
    pthread_attr_getstacksize(&attr,&size);
    printf("thread stack size:%ld\n",size);

    //输出主线程和子线程的id
    printf("tid: %ld,main thread id: %ld\n",tid,pthread_self());


    //释放线程属性资源
    pthread_attr_destroy(&attr);

    pthread_exit(NULL);


    return 0;
}

总结

今天主要介绍了线程的基本操作及函数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值