Linux 嵌入式多线程编程

一、线程与进程

1.进程:是一个具有一定独立功能的程序的一次运行活动,进程是程序执行时的一个实例,同时也是资源分配的最小单元

   Linux中的进程包含:(1)“数据段”存放的是全局变量、常数以及动态数据分配的数据空间;

                   (2)“代码段”存放的是程序代码的数据。

                   (3)“堆栈段”存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。 

2.线程:是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

              多任务,并发的工作方式。

3.进程与线程的关系:

         一个进程由几个线程组成,线程与同属一个进程的其他的线程共享进程所拥有的全部资源。

    进程(资源分配的最小单位)            线程(程序执行的最小单位)
    进程切换占用资源,效率差                      通信效率高
      有独立的地址空间,健壮

                 没有独立的地址空间

(同一进程内的线程共享进程的地址空间)

4.使用线程的优点:(1)“节俭” ,无需分配地址空间;运行于一个进程中的多个线程,它们之间使用相同的地址空间

                                (2)线程间彼此切换所需的时间远远小于进程间切换所需要的时间

                                (3)线程间方便的通信机制,一个线程的数据可以直接为其它线程所用

                                (4)使多CPU系统更加有效

                                       (操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上) 

                               (5)改善程序结构

                                     (一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改)

二、多线程程序设计

(1)创建

      int pthread_create(pthread_t * tidp, const pthread_attr_t*attr, void*(*start_rtn)(void), void*arg)

           tidp:线程id

           attr: 线程属性(通常为空)

           start_rtn:线程要执行的函数

           arg:start_rtn的参数

(2)编译:因为pthread的库不是linux系统的库,所以在进行编译的时候要加上-lpthread

(3) 终止(进程中任何一个线程中调用exit或_exit,那么整个进程都会终止。)

          线程的正常退出方式有:(1) 线程从启动例程中返回

                                         (2) 线程可以被另一个线程终止

                                         (3) 线程自己调用pthread_exit函数

(4) 退出void pthread_exit(void * rval_ptr)

(5)等待: 阻塞调用线程,直到指定的线程终止。

       int pthread_join(pthread_t tid,void **rval_ptr)

              tid :等待退出的线程id

              rval_ptr:线程退出的返回值的指针

(6)线程同步: 

       线程之间对资源的竞争:

                (1)互斥量Mutex:线程在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么该线程                                                    将会阻塞在这里.只有等到其他线程释放掉该互斥量后,该线程才有可能得到该互斥量。

                                                  互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。

                (2) 信号灯Semaphore:

                (3)条件变量Conditions:

 

 

 

 

 

 

 

/************************************************ * * 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、付费专栏及课程。

余额充值