0基础学会创建线程相关的知识(内附C语言源码)

一、线程定义

1、与进程类似,,线程是允许应用程序并发执行多个任务的一种机制。一个进程可以包含有多个线程。同一个程序中的所有线程均会独立执行相同的程序,且共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段(Linux中的进程只是多线程程序的一个特例,该进程只包含一个线程)

2、进程是CPU分配资源的最小单位,线程是操作系统调度执行的最小单位。

3、线程是轻量级的进程LWP(Light Weight Process),在Linux环境下线程的本质是进程。

4、查看指定进程的LWP号:ps -Lf pid。

二、线程与进程的区别

1、进程间的信息难以共享。除去只读代码段外,父子进程并未共享内存,因此必须采用一些进程间通信方式,在进程间进行信息交换,例如进程间通信(fifo、pipe、mmap)。

2、调用fork()来创建进程的代价较高,即便利用写时复制,仍然需要复制诸如内存页表和文件描述符表之类的多种进程属性,这意味着fork()调用在时间上依然不菲。

3、线程之间能够方便、快速共享信息。只需将数据复制到共享(全局或堆)变量中即可。

4、创建线程要比创建进程快10倍不止,线程间是共享虚拟空间的,无需采用写时复制内存,也无需复制页表。

三、线程间共享和非共享资源

共享资源:进程ID和父进程ID 、进程组ID和会话ID、用户ID和用户组ID、文件描述符、信号处置、文件权限掩码、当前工作目录、虚拟地址空间(除栈、.txt).

非共享资源:线程ID、信号掩码、线程特有数据、error变量、实时调度策略和优先级、栈、本地变量和函数调用。

四、线程函数的学习

1、创建线程

一般情况下,main函数所在的线程称之为主线程,其余创建的线程称之为子线程。

程序中默认只有一个进程,调用一次fork()函数就会产生两个进程。

程序中默认只有一个线程,调用一次pthread_creat()函数就会产生两个线程。

#include <pthread.h>
int pthread_create(pthread_t *pthread,const  pthread_attr_t  *attr,void  *(*start_rountn)(void *),void  *arg);

-功能:创建一个子线程

-参数:

        -pthread:传出参数,线程创建成功后,子线程的线程ID被写到该变量中。

        -attr:设置线程的属性,一般使用默认值,NULL。

        -start_routine:函数指针,这个函数是子线程需要处理的逻辑代码。

        -arg:给第三个参数使用,传参

-返回值:

        成功:0

        失败:返回错误号。这个错误号和之前的errno不太一样

       获取错误号信息:char *strerror(int errnum);

虽然下面的程序没有任何意义,但是非常突出的显示了这个函数的使用特点。

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
void *tfn(void *argc)
{
    for(int i=0;i<5;++i)
    printf("I am %dth child\n",i+1);
    exit(0);

}
int main()
{
    pthread_t pthread;
    int ret=pthread_create(&pthread,NULL,tfn,NULL);
    if(ret!=0)
    {
        printf("线程创建失败",strerror(ret));
    }
    while(1)//加一个死循环是为了一直等待子线程
    {}
    return 0;
}

 所以输出结果为:

你学会了嘛?点个赞再走吧。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值