线程基础

一、线程的概念: 进程内部的一条执行序列,进程内部至少有一条执行线程,即main函数的执行体。 进程内部可以有多条线程,称为多线程, main 函数的线程称之为主线程, 其他线程称之为函数线程。 函数线程是由主线程通过系统调用函数创建的。
二、线程与进程的区别
1. 进程是资源分配的最小单位, 线程是调度(执行) 的最小单位。
2. 进程由两部分构成:进程内核对象,地址空间。线程也由两部分组成:线程内核对象,操作系统用它来对线程实施管理。线程堆栈,用于维护线程在执行代码时需要的所有函数参数和局部变量。
3. 进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
4. 进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
5. 线程切换比进程切换消耗小。
6. 在多处理机系统中,对于传统的进程,即单线程进程,不管有多少处理机,该进程只能运行在一个处理机上。但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行,这无疑将加速进程的完成。因此,现代处理机OS都无一例外地引入了多线程。
7. 一个线程只能属于一个进程,而一个进程可以有多个线程。
三、线程的分类
1. 用户级: 在用户空间是多线程的, 内核只识别进程整体。 线程创建、 管理、 销毁都是由用户空间负责, 用户通过调用库函数在完成。
2. 内核级: 线程的创建、 控制、 销毁都是由内核实现的, 每个线程对内核都是可见的。
3. 组合模型: 一部分是用户级, 一部分内核级线程。 介于内核级和用户级之间, 用户态创建多个线程, 内核看到的也是多个, 只是这是种 m: n 的对应关系。
这里写图片描述
四、怎样创建线程
库函数: int pthread_create();
五、线程运行特点:所有线程同时运行。
六、 线程怎么结束
进程: exit;
线程: pthread_exit();
线程怎么等待其他线程结束。
七、 线程间数据共享
1. 全局变量
2. 局部变量(栈区)
3. 堆区
4. 文件
八、代码

//基本的线程函数代码,主线程和函数线程的生成、输出
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <pthread.h>

int *s = NULL;

void * pthread_fun(void *arg)//线程函数
{
    printf("pthread function start\n");

    int i = 0;
    for(; i < 5; ++i)
    {
        sleep(1);
        printf("pthread function \n");
    }

    printf("a = %d\n", s[0]);
    s[0] = 20;
}

void main()
{
    printf("main start\n");
    s = (int*)malloc(4);
    s[0] = 10;
    sleep(2);
    pthread_t id;
    int res = pthread_create(&id, NULL, pthread_fun, NULL);//生成线程,线程函数一般传参为NULL
    assert(res == 0)
    printf("pthread create success\n");
    int i = 0;
    for(; i < 3; ++i)
    {
        sleep(1);
        printf("main pthread\n");
    }
    pthread_join(id, NULL);
/*pthread_join是为了防止主线程没有给其他线程执行的时间就返回了而设计的, pthread_join(thread_t th,void ** thread_return )是使主线程等待th线程运行结束再运行*/
    printf("%d\n", s[0]);
}
/*生成两个函数线程,函数线程1是输出100以内所有的素数,函数2是对数组进行冒泡排序*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <pthread.h>
#include <math.h>

void *fun1(void *arg)
{
    sleep(1);
    pthread_t id = *(pthread_t*)arg;
    pthread_join(id, NULL);
    int i = 0;
    for(i = 2; i < 100; ++i)
    {
        int j = 2;
        for(; j <= i/2; ++j)
        {
            if(i % j == 0)
            {
                break;
            }
        }

        if(j > i/2)
        {
            printf("%d   ", i);
        }
    }

    printf("\n");
}

void *fun2(void *arg)
{
    int arr[] = {23,12,43,14,76,34,55,93,64,6};
    int len = sizeof(arr)/sizeof(arr[0]);
    int i = 0, j = 0;
    for(; i < len - 1; ++i)
    {
        int min = i;
        for(j = i + 1; j < len; ++j)
        {
            if(arr[j] < arr[min])
            {
                min = j;
            }
        }

        int c = arr[min];
        arr[min] = arr[i];
        arr[i] = c; 
    }

    for(i = 0; i < len; ++i)
    {
        sleep(1);
        printf("%d   ", arr[i]);
        fflush(stdout);
    }

    printf("\n");
    pthread_exit("sort over");
}

void main()
{
    pthread_t id1,id2;
    int res = pthread_create(&id1, NULL, fun1, (void*)&id2);
    assert(res == 0);
    res = pthread_create(&id2, NULL, fun2, NULL);
    assert(res == 0);

    char *p = NULL;

    pthread_join(id1, NULL);
    //pthread_join(id2,(void**)&p);

    //printf("%s\n", p);

    printf("main end\n");
}
先展示下效果 https://pan.quark.cn/s/e81b877737c1 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 执行环境,它使开发者能够在服务器端执行 JavaScript 编程,显著促进了全栈开发的应用普及。 在 Node.js 的开发流程中,`node_modules` 文件夹用于存储所有依赖的模块,随着项目的进展,该文件夹可能会变得异常庞大,其中包含了众多可能已不再需要的文件和文件夹,这不仅会消耗大量的硬盘空间,还可能减慢项目的加载时间。 `ModClean 2.0` 正是为了应对这一挑战而设计的工具。 `ModClean` 是一款用于清理 `node_modules` 的软件,其核心功能是移除那些不再被使用的文件和文件夹,从而确保项目的整洁性和运行效率。 `ModClean 2.0` 是此工具的改进版本,在原有功能上增加了更多特性,从而提高了清理工作的效率和精确度。 在 `ModClean 2.0` 中,用户可以设置清理规则,例如排除特定的模块或文件类型,以防止误删重要文件。 该工具通常会保留项目所依赖的核心模块,但会移除测试、文档、示例代码等非运行时必需的部分。 通过这种方式,`ModClean` 能够协助开发者优化项目结构,减少不必要的依赖,加快项目的构建速度。 使用 `ModClean` 的步骤大致如下:1. 需要先安装 `ModClean`,在项目的根目录中执行以下命令: ``` npm install modclean -g ```2. 创建配置文件 `.modcleanrc.json` 或 `.modcleanrc.js`,设定希望清理的规则。 比如,可能需要忽略 `LICENSE` 文件或整个 `docs`...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值