《嵌入式Linux高级编程--05posix_线程编程.pdf》由会员分享,可在线阅读,更多相关《嵌入式Linux高级编程--05posix_线程编程.pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式嵌入式Linux高级编程高级编程 主讲:成宝宗 Linux线程编程 主讲:成宝宗 Linux线程概述 进程是系统中程序执行和资源分配的基本单位。每个进程有自己的数据段、代码段和堆栈段。线程通常叫做轻型的进程。线程是在共享内存空间中并发执行的多道执行路径,他们共享一个进程的资源。因为线程和进程比起来很小,所以相对来说,线程花费更少的CPU资源。用户地址空间 线程一 线程二 线程三 进 程 图1 进程与线程的关系 创建线程#include int pthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)
2、(void*),void*arg)功能:创建线程。返回值:成功返回0。参数:thread:线程标识符(唯一性)attr:线程属性设置 start_routine:线程函数起始地址 arg:传递给start_routine的参数 线程退出#include void pthread_exit(void*retval)功能:线程主动退出。参数:retval:pthread_exit调用者线程的返回值,可由其他函数和pthread_join来检测获取。#include int pthread_cancel(pthread_t thread);功能:取消指定线程。返回值:成功返回0。等待线程#inclu
3、de int pthread_join(pthread_t th,void*thread_return)功能:等待指定线程。返回值:成功返回0。参数:th:等待线程的标识符 thread_return:用户定义指针,用来存储被等待线程的返回值。线程同步 1,互斥量(mutex)2,信号量 互斥量(mutex)mutex是一种简单的加锁的方法来控制对共享资源的访问。在同一时刻只能有一个线程掌握某个互斥上的锁,拥有上锁状态的线程能够对共享资源进行访问。若其他线程希望上锁一个已经被上了互斥锁的资源,则该线程挂起,直到上锁的线程释放互斥锁为止。互斥锁的操作主要包括以下几个步骤:互斥锁初始化:pthre
4、ad_mutex_init 互斥锁上锁:pthread_mutex_lock 互斥锁解锁:pthread_mutex_unlock 消除互斥锁:pthread_mutex_destroy 互斥量(mutex)#include int pthread_mutex_init(pthread_mutex_t*mutex,const pthread_mutexattr_t*mutexattr);功能:初始化锁。返回值:成功返回0。#include int pthread_mutex_lock(pthread_mutex_t*mutex);功能:访问资源 返回值:成功返回0。互斥量(mutex)#inc
5、lude int pthread_mutex_unlock(pthread_mutex_t*mutex);功能:释放资源 返回值:成功返回0。#include int pthread_mutex_destroy(pthread_mutex_t*mutex);功能:取消毁锁 返回值:成功返回0。信号量 信号量依据取值开关(0与大于0)来控制运行。信号量相关函数包括:sem_init sem_wait sem_postint sem_destroy 信号量#include int sem_init(sem_t*sem,int pshared,unsigned int value);功能:初始化信号
6、量。返回值:成功返回0,错误返回-1。说明:sem:信号量 pshared:为0时表示是当前进程局部信号量;非0表示其它进程可以共享该信号量。value:信号量初始值。信号量#include int sem_wait(sem_t*sem);功能:实现减1操作,当sem=0则阻塞。返回值:成功返回0,错误返回-1。#include int sem_post(sem_t*sem);功能:实现加1操作。返回值:成功返回0,错误返回-1。#include int sem_destroy(sem_t*sem);功能:释放资源。返回值:成功返回0,错误返回-1。void*thread_function(v
7、oid*arg)while(1)printf(HELLO);sleep(rand()%3);printf(WORLD!n);sleep(rand()%3);int main()int res;pthread_t a_thread;res=pthread_create(&a_thread,NULL,thread_function,NULL);while(1)printf(hello);sleep(rand()%3);printf(world!n);sleep(rand()%3);在程序中的适当的位置添加相应的锁代码,使得打印的hello world和HELLO WORLD不会穿插在一起。编程练习:哲学家就餐 有五个哲学家,这些哲学家们只能做两件事思考和吃饭,吃饭的时候需要两只筷子,但是哲学家很穷,只能买得起五根筷子,于是他们坐成一个圈,两个人的中间放一根。吃饭的时候必须同时得到两只筷子,如果筷子正在使用,那他们只能等待。每个哲学家都是一个单独的线程,每个线程循环做以下动作:思考rand()%10秒,然后先拿起左手的筷子,再拿起右手的筷子,有任何一边拿不到就一直等着,两只筷子全部拿到就吃饭rand()%10秒,然后放下筷子继续思考。