线程简介及其函数使用实例(gcc *.c -lpthread)

1.概念

线程(LWP(Light Weight process))

          线程是轻量级的进程,(是比进程粒度更小的执行单元)进程是分配资源的最小单位(0-3G)(PS:一辆马车8匹马 进程 其中的一个马是线程),线程是调度(PS:或执行)的最小单位。线程本身不占用资源它是共享进程的资源(PS:一个进程中的许多线程 共享一个进程的0-3G空间)。线程没有进程安全,(PS:考虑安全 选择多进程,考虑并发性 选多线程因为如果一个线程导致进程结束,其他所有的线程都不能执行。多线程的并发性比多进程的高,因为线程间切换比进程间切换时间短。线程间资源共享(PS:一个进程的全局变量 其中的线程能全部共享),所以线程间通信要比进程间通信更为容易。

ps -ajx ==>看进程附加态(状态带(小L)l,代表多线程)
ps -eLf ==>多线程
htop ==>多线程

2.线程接口提供方式

多线程创建的接口是第三方库提供的libpthread.so,在编译的时候就必须链接这个库gcc xxx.c -lpthread,man手册需要使用apt-get来安装(sudo apt-get install manpages-*)。

3.线程创建使用到的函数

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                  void *(*start_routine) (void *), void *arg);
功能:创建一个线程
参数:
    @thread:线程号
    @attr:线程属性,使用默认值NULL (PS线程属性:https://docs.oracle.com/cd/E19253-01/819-7051/6n919hpaa/index.html)
    @start_routine:线程处理函数(线程体)
 @arg:给线程处理函数传参(PS:多参数 可用结构体传参)
返回值:成功返回0,失败返回错误码
Compile and link with -lpthread.
(PS:编译的时候 要链接这个库,gcc xxx.c -lpthread)

4.多线程创建实例 (gcc 01thread.c -lpthread编译)

01thread.c

#include <head.h>
void * thread(void *arg){
    printf("子线程...\n");
}
int main(int argc,const char * argv[])
{
    pthread_t tid;
    if((errno=(pthread_create(&tid,NULL,thread,NULL))!=0)){
       perror("pthread_create error");
       exit(-1); //pthread_create函数成功返回0
    }
    printf("主线程...\n");
    sleep(1);//不能让进程退出 线程退出了 线程就没有执行的内存了
    return 0;
}

5.多线程创建实例 (gcc 02thread.c -lpthread编译)

02thread.c

#include <head.h>
void *thread(void *arg)
{
    int a = *(int *)arg;
    printf("a = %d\n", a);
    printf("子线程...\n");
}
int main(int argc, const char *argv[])
{
    pthread_t tid;
    int num = 100;
    if ((errno = (pthread_create(&tid, NULL, thread, (void *)&num)) != 0))
        {
            perror("pthread_create error");
            exit(-1); // pthread_create函数成功返回0
        }

    printf("主线程...\n");
    sleep(1); // 不能让进程退出 线程退出了 线程就没有执行的内存了
    return 0;
}

6.多线程执行顺序问题

多线程执行没有先后顺序、时间片轮询,上下文切换

7.多线程占用内存问题

多线程可以共享全局变量,每个线程都可以对此全局变量进行读写操作(全局变量可以被多线程贡共享)

#include <head.h>
int B = 10;
void *thread1(void *arg)
{
    printf("子线程1...\n");
    while (1)
    {
        B++;
        sleep(1);
    }
}
void *thread2(void *arg)
{
    printf("子线程2...\n");
    while (1)
    {
        printf("B= %d\n", B);
        sleep(1);
    }
}
int main(int argc, const char *argv[])
{
    pthread_t tid1, tid2;

    if ((errno = (pthread_create(&tid1, NULL, thread1, NULL)) != 0))
    {
        perror("pthread_create error");
        exit(-1); // pthread_create函数成功返回0
    }
    if ((errno = (pthread_create(&tid2, NULL, thread2, NULL)) != 0))
    {
        perror("pthread_create error");
        exit(-1); // pthread_create函数成功返回0
    }

    printf("主线程...\n");
    while (1)
    {
    }
    // 不能让进程退出 线程退出了 线程就没有执行的内存了
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值