进线程——线程创建退出

进程:每一个进程相互独立,即使一个进程结束也没有太大影响。但在任务切换时需要频繁刷新cache缓存。故后面引出轻量级进程---线程

线程也是最小的任务调度单位

一个进程创建的多个线程可以共享一个进程的地址空间及相关资源

线程共享数据:

  1.         用户名、用户组名

  2.         静态数据和全局变量

  3.         文件描述符

非共享数据:

  1.         线程id

  2.         状态、优先级

  3.         PC

  4.         堆栈

线程相关接口函数

        pthread_creat()   --创建线程

        pthread_exit()     --退出线程

        pthread_join()     --等待线程结束

(1)线程创建

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                    void *(*start_routine) (void *), void *arg);

参数:

        thread:线程对象(线程的编号)

        attr:线程属性,填NULL表示使用默认属性

        start_routine:调用函数首地址

        arg:函数形参参数,如果没有参数就填NULL

返回值:成功返回0,创建失败返回错误码(小于0)

注意:

        如果主线程先结束,整个程序都会结束。

示例代码:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a = 5;
typedef struct
{
    int a;
    int b;
}m_arg;


void *funct(void *head)     //创建的线程
{
    m_arg  *b = (m_arg *)head;
    printf("%d\n",b->b);
    while((b->a)--)
    {
        printf("aaaaaaaa%d\n",b->a);
        sleep(1);
    }
}

int main(int argc, char *argv[])
{ 
    m_arg arr = {5,6};
    pthread_t thread;
    printf("%d\n",a);
    int ret = pthread_create(&thread,NULL,funct,&arr);//创建线程
    if(ret != 0)                          //判断创建是否成功
    {
        perror("pthread_create");
        exit(0);
    }
    while(1)   //主线程
    {
        printf("bbbbbbbb\n");
        sleep(1);
    }
    return 0;
} 

(2)退出线程

 #include <pthread.h>

  void pthread_exit(void *retval)

参数:

        retval:线程结束返回的信息,可以是任意信息,一般是字符串,没有可以填NULL

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a = 5;
typedef struct
{
    int a;
    int b;
}m_arg;


void *funct(void *head)     //创建的线程
{
    m_arg  *b = (m_arg *)head;
    printf("%d\n",b->b);
    while((b->a)--)
    {
        if(b->a == 3)
            pthread_exit(NULL);      //等待秒关闭线程
        printf("aaaaaaaa%d\n",b->a);
        sleep(1);
    }
}

int main(int argc, char *argv[])
{ 
    m_arg arr = {5,6};
    pthread_t thread;
    printf("%d\n",a);
    int ret = pthread_create(&thread,NULL,funct,&arr);//创建线程
    if(ret != 0)                          //判断创建是否成功
    {
        perror("pthread_create");
        exit(0);
    }
    while(1)   //主线程
    {
        printf("bbbbbbbb\n");
        sleep(1);
    }
    return 0;
} 

(3)等待线程退出

#include <pthread.h>

int pthread_join(pthread_t thread,void **retval) ;

参数:

        thread:线程对象(线程编号)

        retval:接受返回的字符串信息

返回值:

        成功返回0,创建失败返回错误码。

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

typedef struct
{
    int a;
    int b;
}m_arg;


void *funct(void *head)          //线程2函数
{
    m_arg  *b = (m_arg *)head;
    printf("%d\n",b->b);
    while((b->a)--)
    {
        if(b->a == 3)
            pthread_exit("thread_funtc1");
        printf("aaaaaaaa%d\n",b->a);
        sleep(1);
    }
}

void *funtc2()            //线程1函数
{
    int n = 5;
    while(n--)
    {
        if(n == 2)
            pthread_exit("thread_funtc2");
        printf("cccccccc\n");
        sleep(1);
    }
}
int main(int argc, char *argv[])
{ 
    m_arg arr = {5,6};
    pthread_t thread;
    pthread_t thread2;
    int ret = pthread_create(&thread,NULL,funct,&arr);    //创建线程1
    if(ret != 0)
    {
        perror("pthread_create");
        exit(0);
    }
    int ret1 = pthread_create(&thread2,NULL,funtc2,NULL); //创建线程2
    if(ret1 != 0)
    {
        perror("pthread_create2");
        exit(0);
    }
    void *result = NULL;
    pthread_join(thread,&result);    //等待线程1退出
    printf("%s\n",(char *)result);
    pthread_join(thread,&result);    //等待线程2退出
    printf("%s\n",(char *)result);
    printf("bbbbbbbb\n");
    sleep(1);
    return 0;
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值