Linux下的C编程实战之四

Linux下的C编程实战之四

ID:47162208

大小:54.50 KB

页数:7页

时间:2019-08-14

Linux下的C编程实战之四_第1页
Linux下的C编程实战之四_第2页
Linux下的C编程实战之四_第3页
Linux下的C编程实战之四_第4页
Linux下的C编程实战之四_第5页
资源描述:

《Linux下的C编程实战之四》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Linux下的C编程实战之四1.Linux“线程”  Linux内核只提供了轻量进程的支持,未实现线程模型,但Linux尽最大努力优化了进程的调度开销,这在一定程度上弥补无线程的缺陷。Linux用一个核心进程(轻量进程)对应一个线程,将线程调度等同于进程调度,交给核心完成。  笔者曾经在《基于嵌入式操作系统VxWorks的多任务并发程序设计》(《软件报》2006年第5~12期)中详细叙述了进程和线程的区别,并曾经说明Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。大家知道,进程是资源分配的单位,同一进程中的多个线程共享

2、该进程的资源(如作为共享内存的全局变量)。Linux中所谓的“线程”只是在被创建的时候“克隆”(clone)了父进程的资源,因此,clone出来的进程表现为“线程”,这一点一定要弄清楚。因此,Linux“线程”这个概念只有在打冒号的情况下才是最准确的,可惜的是几乎没有书籍留心去强调这一点。  目前Linux中最流行的线程机制为LinuxThreads,所采用的就是线程-进程“一对一”模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。LinuxThreads由XavierLeroy(Xavier.Leroy@inria.fr)负责开发完成,并已绑定在GLIBC中发行,它

3、实现了一种BiCapitalized面向Linux的Posix1003.1c“pthread”标准接口。Linuxthread可以支持Intel、Alpha、MIPS等平台上的多处理器系统。  按照POSIX1003.1c标准编写的程序与Linuxthread库相链接即可支持Linux平台上的多线程,在程序中需包含头文件pthread.h,在编译链接时使用命令:gcc-D-REENTRANT-lpthreadxxx.c  其中-REENTRANT宏使得相关库函数(如stdio.h、errno.h中函数)是可重入的、线程安全的(thread-safe),-lpthread则意味着链接库目录

4、下的libpthread.a或libpthread.so文件。使用Linuxthread库需要2.0以上版本的Linux内核及相应版本的C库(libc5.2.18、libc5.4.12、libc6)。  2.“线程”控制  线程创建  进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create:pthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(start_routine)(void*),void*arg);  start_routine为新线程的入口函数,arg为传递

5、给start_routine的参数。  每个线程都有自己的线程ID,以便在进程内区分。线程ID在pthread_create调用时回返给创建线程的调用者;一个线程也可以在创建后使用pthread_self()调用获取自己的线程ID:pthread_self(void);  线程退出  线程的退出方式有三:  (1)执行完成后隐式退出;  (2)由线程本身显示调用pthread_exit函数退出;pthread_exit(void*retval);  (3)被其他线程用pthread_cance函数终止:pthread_cance(pthread_tthread);  在某线程中调用此函数

6、,可以终止由参数thread指定的线程。  如果一个线程要等待另一个线程的终止,可以使用pthread_join函数,该函数的作用是调用pthread_join的线程将被挂起直到线程ID为参数thread的线程终止:pthread_join(pthread_tthread,void**threadreturn);3.线程通信  线程互斥  互斥意味着“排它”,即两个线程不能同时进入被互斥保护的代码。Linux下可以通过pthread_mutex_t定义互斥体机制完成多线程的互斥操作,该机制的作用是对某个需要互斥的部分,在进入时先得到互斥体,如果没有得到互斥体,表明互斥部分被其它线程拥有,

7、此时欲获取互斥体的线程阻塞,直到拥有该互斥体的线程完成互斥部分的操作为止。  下面的代码实现了对共享全局变量x用互斥体mutex进行保护的目的:intx;//进程中的全局变量pthread_mutex_tmutex;pthread_mutex_init(&mutex,NULL);//按缺省的属性初始化互斥体变量mutexpthread_mutex_lock(&mutex);//给互斥体变量加锁…//对变量x的操作phtread_mu

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。