嵌入式Linux应用开发 4 Linux多线程程序设计1 线程的概念 以及创建一个线程

Linux多线程程序设计

1.线程出现的原因
<1>每一个进程都拥有自己的数据段,代码段和堆栈段,这就造成进程在进行创建和切换以及撤销等操作的时候,需要较大的系统开销。
<2>为了减少系统开销,将进程中演化出了线程
<3>线程存在于进程之中,共享进程的资源
<4>线程是进程中的独立控制流,由环境和一系列的执行指令组成。
通过一个图感受一下进程和线程的不同点
在这里插入图片描述
2.线程和进程去比较
<1>传统意义上的进程被称为重量级的进程,从现代的角度来看,就是只拥有一个线程的进程
<2>线程与进程有着许多类似的性质,包含的关系,所以我们习惯上也称线程为轻量级进程
3.调度
<1>线程是CPU调度和分派的基本单位
<2>进程是系统中程序执行和资源分配的最小单位
<3>线程本身只拥有一部分必须拥有的资源,除此之外需要的资源都需要去进程中去调用
4.并发性和并行性
<1>不仅可以在进程间去进行并发性,在一个进程中的多线程之间也可以去执行并发性。并发性指的是在一个核上也就是只有一个cpu在进行处理的工作,它需要在一个周期内执行完所有的工作,然后一直重复着这个周期的工作,我们的电脑就是,但是由于我们肉眼的感觉,这个软件好像是同时进行的。
在这里插入图片描述
<2>并行性指的是一个系统中存在着多个CPU,每一个CPU去执行一个进程。
5.使用多线程的优点
<1>在多处理器中开发程序的并行性
<2>在等待慢速的IO操作的时候,系统可以去执行其他的线程,提高并发性
<3>模块化的编程,能够更清晰的表达程序中独立事件的关系,结构清晰
<4>占用较少的资源
6.获取进程和线程的id
<1>每一个进程拥有自己的进程号,因此每一个线程也拥有着自己的线程号,但是这里需要注意的是,每一个进程的进程号在整个系统中都是独一无二的,但是每一个线程的线程号只是相对于它所属的进程环境而言的。
<2>进程号用一个pid_t去表示,他是一个非负整数。线程号则用phread_t数据类型来表示。因为二者都是无符号型所以在输出的时候需要用到%u。获取进程id需要调用getpid(),获取线程id需要phread_self();在调用程序中pthread.h库后,在编译的过程中一定要把这个库添加进来,感觉可以理解它是一个动态库
在这里插入图片描述
7.创建一个线程
创建一个线程用到函数体 int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(start_routine)(void),void *arg);
第一个参数:新进程的id,线程标识符地址
第二个参数:线程属性结构地址,这里还没学到直接给她一个空
第三个参数:线程函数的入口地址,填写我们写的函数名
第四个参数:传给新线程执行函数的参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/************************************************ * * The classic producer-consumer example. * Illustrates mutexes and conditions. * by Zou jian guo * 2003-12-22 * *************************************************/ #include #include #include #include "pthread.h" #define BUFFER_SIZE 16 /* Circular buffer of integers. */ struct prodcons { int buffer[BUFFER_SIZE]; /* the actual data */ pthread_mutex_t lock; /* mutex ensuring exclusive access to buffer */ int readpos, writepos; /* positions for reading and writing */ pthread_cond_t notempty; /* signaled when buffer is not empty */ pthread_cond_t notfull; /* signaled when buffer is not full */ }; /*--------------------------------------------------------*/ /* Initialize a buffer */ void init(struct prodcons * b) { pthread_mutex_init(&b->lock, NULL); pthread_cond_init(&b->notempty, NULL); pthread_cond_init(&b->notfull, NULL); b->readpos = 0; b->writepos = 0; } /*--------------------------------------------------------*/ /* Store an integer in the buffer */ void put(struct prodcons * b, int data) { pthread_mutex_lock(&b->lock); /* Wait until buffer is not full */ while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { printf("wait for not full\n"); pthread_cond_wait(&b->notfull, &b->lock); } /* Write the data and advance write pointer */ b->buffer[b->writepos] = data; b->writepos++; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; /* Signal that the buffer is now not empty */ pthread_cond_signal(&b->notempty); pthread_mutex_unlock(&b->lock); } /*--------------------------------------------------------*/ /* Read and remove an integer from the buffer */ int get(struct prodcons * b) { int data; pthread_mutex_lock(&b->lock); /* Wait until buffer is not empty */ while (b->writepos == b->readpos) { printf("wait for not empty\n"); pthread_cond_wait(&b->notempty, &b->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值