linux线程详解

认识线程 线程是操作系统能够进行运算调度的最小单位 。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程 ,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字

认识线程

        线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno常量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。

        在Unix和类Unix操作系统中线程也被称为轻量级进程,但轻量级进程更多指的是内核线程,而把用户线程称为线程。

        "进程——资源分配的最小单位,线程——程序执行的最小单位"        

需要掌握:

多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种。

互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁。

条件操作有 5 种操作:创建,销毁,触发,广播和等待。其他的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素的基本操作封装出来。

线程创建、等待及退出

需包含<pthread.h>

末尾用while卡死防止主程序执行完退出而导致线程退出。

该行while可用线程等待API替代:

pthread_join(&t1,NULL);

线程退出API使用(返回整型数)

线程退出API使用(返回字符串)

线程共享内存空间:即不同线程可以操作同一个全局变量。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
// 返回:若成功返回0,否则返回错误编号
int g_data=0;
void *func1(void *arg)
{
    printf("t1:%ld thread is create\n",(unsigned long)pthread_self());
    printf("t1:param is %d\n",*((int *)arg));
    while(1){
        printf("t1:%d\n",g_data++);
        sleep(1);
        if(g_data==3)//随缘达成条件,因为内存共享。=3时处于别的线程
            pthread_exit(NULL);
    }
}
void *func2(void *arg)
{
    printf("t2:%ld thread is create\n",(unsigned long)pthread_self());
    printf("t2:param is %d\n",*((int *)arg));
    while(1){
        printf("t2:%d\n",g_data++);
        sleep(1);
    }
}
int main()
{
    int ret;
    int param=100;
    pthread_t t1;
    pthread_t t2;

    ret = pthread_create(&t1,NULL,func1,(void *)&param);
    if(ret==0)
    {
         printf("main:creat t1 success\n");
    }
    ret = pthread_create(&t2,NULL,func2,(void *)&param);
    if(ret==0)
    {
         printf("main:creat t2 success\n");
    }

    printf("main:%ld\n",(unsigned long)pthread_self());
    while(1){
        printf("main:%d\n",g_data++);
        sleep(1);
    }
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    return 0;
}
知秋君
上一篇 2024-08-08 22:48
下一篇 2024-08-08 22:12

相关推荐