Linux_线程

概念
有时被称为轻量级进程,是程序执行流的最小单元,是被系统独立调度和分派的基本单位。
线程自己不拥有系统资源,但是线程可以与同属一个进程的其他线程共享该进程拥有的全部资源
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
线程独立的数据:栈、线程id、一组寄存器、errno、信号屏蔽字、调度优先级

线程的优点
代价小、占用资源小、线程切换需要操作系统做的工作少
能充分利用多处理器的可并行数量
等待慢速I/O操作结束的同时,程序可以执行其他计算任务
计算密集型应用,为在多处理器系统上运行,将计算分解到多个线程中实现
I/O密集型应用,为提高性能,将I/O操作重叠,线程可以同时等待不同的I/O操作

线程的缺点
健壮性降低,线程之间缺乏保护
如果计算密集型线程的数量比可用的处理器多,可能有较大的性能损失,增加额外的同步和调度开销,而可用资源不变
在一个线程中调用某些OS函数会对整个进程造成影响
编写、调试一个多线程程序比单线程程序困难

创建线程

#include<pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
    //成功返回0,否则返回错误编号
pthread_t pthread_self();
    //返回调用线程的id

函数成功返回时,新线程id会被设置成tidp指向的内存单元。
attr参数用于定制不同的线程属性
新线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数arg。

线程控制
如果任意线程调用了exit、_Exit或者_exit,整个进程都会终止。类似的,如果默认动作是终止进程,那么发送到线程的信号会终止整个进程。
3种方式退出,可以不终止整个进程情况下停止它的控制流
(1)线程可以简单的从启动例程中返回,返回值是线程的退出码。
(2)线程可以被同一进程的其他线程取消
(3)线程调用pthread_exit

#include<pthread.h>
void pthread_exit(void *rval_ptr);
    //线程自杀
void pthread_cacel(pthread_t id);
    //杀死其他线程
int pthread_join(pthread_t thread, void **rval_ptr);
    //等待线程死亡,成功返回0,失败返回错误编号

线程的分离与结合
调用pthread_join()的线程阻塞,直到等待的线程结束,当不希望这样时,
可以把线程设置成分离属性,主线程不会等待,如果分离的子线程还没结束时,主线程结束则子线程也会被结束。

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

void* t1(void* argv)
{
    int i = 0;
    pthread_detach(pthread_self());
    while(i>=0)
    {
        sleep(2);
        printf("t1: %d\n", i++);
        if(i == 5)
            pthread_exit(NULL);
    }

}

void* t2(void* argv)
{
    int i = 0;
    while(i>=0)
    {
        sleep(1);
        printf("t2: %d\n", i++);
        if(i == 5)
            pthread_exit(NULL);
    }

}
int main()
{
    pthread_t p1;
    pthread_t p2;

    pthread_create(&p1, NULL, t1, NULL);
    pthread_create(&p2, NULL, t2, NULL);

    printf("begin wait t2 end\n");
    pthread_join(p2, NULL);
    printf("the t2 end\n");

    //sleep(8);
    printf("begin wait t1 end\n");
    int t = pthread_join(p1, NULL);
    if(t == 0)
        printf("detach failed\n");
    else
        printf("detach success\n");
    sleep(5);
    printf("all end\n");


    return 0;
}

猜你喜欢

转载自blog.csdn.net/cute_shuai/article/details/80715654
今日推荐