IO进、线程——线程(线程的创建、线程的退出、线程的回收、线程的分离和多线程并发编程)

线程

并发执行的轻量级进程

进程是资源分配的最小单位,线程是任务调度的最小单位

线程是进程的一部分,是任务调度的最小单位。一个进程可以包含多个线程,这些线程可以并发执行,共享进程的资源,但每个线程都有自己的执行路径。在多核处理器上,多个线程可以同时运行,提高了程序的性能和响应能力。下面将对线程的创建、退出、回收和分离

1 创建线程

#include <pthread.h>

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

功能:创建子线程去执行任务
返回值:成功返回0,失败返回非0
参数说明
thread:线程对象(线程取个名字)
attr:线程属性,使用默认属性写NULL
start_routine:线程要去执行的任务(任务以函数为单位)

void *dosomething(void *arg);

arg:传递给start_routine的参数

pthread_t th;
pthread_t th1;
int ret = pthread_create(&th, NULL, test, "线程1");
int ret1 = pthread_create(&th1, NULL, test, "线程2");
if(ret != 0 || ret1 != 0){
    perror("pthread_create");
    return -1;
}

2 线程退出

void pthread_exit(void *retval);

功能:退出当前线程
参数说明
retval:线程退出时想要传递的信息

在线程执行完任务后,可以调用**pthread_exit(NULL)**来正常退出线程。

3 线程回收

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

功能:阻塞回收退出的子线程
返回值:成功返回0,失败返回-1
参数说明:
thread:要回收的线程
retval:指向线程退出时传递的信息

void *retval;
ret = pthread_join(th, &retval);
ret1 = pthread_join(th1, &retval);
if(ret < 0 || ret1 < 0){
    perror("pthread_join");
    return -1;
}

4 线程分离

int pthread_detach(pthread_t thread);

功能:断绝父子线程的关系
返回值:成功返回0,失败返回-1
参数说明:
thread:要断绝关系的子线程对象
注:一般在创建完子线程过后马上调用分离函数

当线程分离后,线程执行完任务后会自动释放资源,不需要再主线程中调用pthread_join()来回收线程。一般在创建完子线程后,如果不需要回收子线程资源,可以立即调用pthread_detach()函数进行分离。

pthread_detach(th);
pthread_detach(th1);
多线程并发

①两个线程同时在打印40个数,各打印个互不干扰。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *test(void *args){
    char *name = (char *)args;
    for(int i = 0; i < 40; i++){
        printf("线程:%s 正在处理第:%d\n", name, i);
    }
    return NULL;
}

int main(int argc, char *argv[])
{ 
    pthread_t th;
    pthread_t th1;
    int ret = pthread_create(&th, NULL, test, "线程1");
    int ret1 = pthread_create(&th1, NULL, test, "线程2");
    if(ret != 0 || ret1 != 0){
        perror("pthread_create");
        return -1;
    }
    pthread_detach(th);
    pthread_detach(th1);
    void *retval;
    ret = pthread_join(th, &retval);
    ret1 = pthread_join(th1, &retval);
    if(ret < 0 || ret1 < 0){
        perror("pthread_join");
        return -1;
    }
    sleep(2);

    return 0;
} 

②三个线程共同分担打印50个数

/*===============================================
*   文件名称:并发多线程.c
*   创 建 者:杨桃清
*   创建日期:2023年07月31日 00:22
*   描    述:
================================================*/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

//声明互斥锁
pthread_mutex_t mutex;
int count = 0;

void *print_num(void *args){
    char *name = (char *)args;
    while(1){
        //申请互斥锁
        pthread_mutex_lock(&mutex);
        
        if(count >= 50){
            //释放互斥锁
            pthread_mutex_unlock(&mutex);
            break;
        }
        
        printf("线程:%s  正在打印:%d\n", name, count);
        count++;
        //最后释放锁
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

int main(int argc, char *argv[])
{ 
    pthread_t th1;
    pthread_t th2;
    pthread_t th3;
    
    //初始化锁
    pthread_mutex_init(&mutex, NULL);
    //创3个建线程
    int ret1 = pthread_create(&th1, NULL, print_num, "th1");
    int ret2 = pthread_create(&th2, NULL, print_num, "th2");
    int ret3 = pthread_create(&th3, NULL, print_num, "th3");
    if(ret1 != 0 || ret2 != 0 || ret3 != 0){
        perror("pthread_create");
        return -1;
    }

    //void* retval;
    pthread_join(th1, NULL);//等待第一个线程执行完毕
    pthread_join(th2, NULL);//等待第二个线程执行完毕
    pthread_join(th3, NULL);//等待第三个线程执行完毕

    //销毁互斥锁
    pthread_mutex_destroy(&mutex);
    
    return 0;
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值