Linux编程(线程)

一、线程和进程的区别

线程:进程内的线程共享进程的资源,线程是CPU调度的最小单位,如果线程所在的进程结束,线程也结束

进程:是系统分配资源的最小单位,一个进程可以有多个线程,至少有一个主线程

二、创建线程

编译时需要加上 gcc 03_test.c -lpthread

 #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:传给线程函数的参数,回调函数的参数。

返回值:

成功:返回0

失败:返回非0

#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
 
void* myFun(void* arg);
int main(int argc, char const *argv[])
{
    /* code */
    pthread_t tid;
    
    //创建线程(不阻塞)
    pthread_create(&tid,NULL,myFun,NULL);
    return 0;
}
 
void* myFun(void* arg)
{
    printf("%lu线程执行任务1",(unsigned long)pthread_self());
}

三、回收线程资源

#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
功能:
等待子线程结束,并回收子线程资源。
参数:
thread:被等待的线程号。
retval:用来存储线程退出状态的指针的地址。
返回值:
成功返回0,失败返回非0。

四、创建多个线程及回收线程资源

#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
 
void* myFun1(void* arg);
void* myFun2(void* arg);
 
int main(int argc, char const *argv[])
{
    /* code */
    pthread_t tid1,tid2;
    
    //创建线程(不阻塞)
    pthread_create(&tid1,NULL,myFun1,"任务1");
    pthread_create(&tid2,NULL,myFun2,"任务2");
 
    void *ret1,*ret2;
    //回收线程资源-阻塞
    pthread_join(tid1,&ret1);
    pthread_join(tid2,&ret2);
 
    printf("ret1=%s\n",(char*)ret1);
    printf("ret2=%s\n",(char*)ret2);
 
    return 0;
}
 
void* myFun1(void* arg)
{
    char* str=(char*)arg;
 
    printf("线程1执行%s\n",str);
    return arg;
}
 
void* myFun2(void* arg)
{
    char* str=(char*)arg;
 
    printf("线程2执行%s\n",str);
    return arg;
}

五、线程退出的方式

1、pthread_exit()

 #include <pthread.h>

       void pthread_exit(void *retval);
       参数:
       retval:线程返回状态

2、pthread_cancel()

#include <pthread.h> 
int pthread_cancel(pthread_t thread); 

#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
 
void* myFun1(void* arg);
void* myFun2(void* arg);
 
int main(int argc, char const *argv[])
{
    /* code */
    pthread_t tid1,tid2;
    
    //创建线程(不阻塞)
    pthread_create(&tid1,NULL,myFun1,"任务1");
    pthread_create(&tid2,NULL,myFun2,"任务2");
 
    printf("5秒后取消线程1\n");
    sleep(5);
    pthread_cancel(tid1);
    
    void *ret1,*ret2;
    
    //回收线程资源-阻塞
    //pthread_join(tid1,&ret1);
    pthread_join(tid2,&ret2);
 
    printf("ret1=%s\n",(char*)ret1);
    printf("ret2=%s\n",(char*)ret2);
 
    return 0;
}
 
void* myFun1(void* arg)
{
    char* str=(char*)arg;
    while(1)
    {
        printf("线程1执行%s\n",str);
        sleep(1);
    }
 
    return arg;
}
 
void* myFun2(void* arg)
{
    char* str=(char*)arg;
 
    printf("线程2执行%s\n",str);
    pthread_exit("over");
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值