《step by steplinux c多线程编程入门(基本api及多线程》由会员分享,可在线阅读,更多相关《step by steplinux c多线程编程入门(基本api及多线程(9页珍藏版)》请在金锄头文库上搜索。
1、介绍:什么是线程,线程的优点是什么介绍:什么是线程,线程的优点是什么线程在Unix系统下,通常被称为轻级的进程,线程虽然是进程,但却可以看作是Unix进程的表亲,同 一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但 同一进程中的多个线程有各自的调用栈有各自的调用栈(call stack),自己的寄存器环境(,自己的寄存器环境(register context),自己的线程,自己的线程 本地存储本地存储(threadlocal storage)。 一个进程可以有很多线程,每条线程并行执
2、行同的任务。线程可以提高应用程序在多核环境下处理诸如文件I/O或者socket I/O等会产生堵塞的情况的表现性能。在 Unix系统中,一个进程包含很多东西,包括可执行程序以及一大堆的诸如文件描述符地址空间等资源。在 很多情况下,完成相关任务的同代码间需要交换数据。如果采用多进程的方式,那么通信就需要在用户 空间和内核空间进行频繁的切换,开销很大。但是如果使用多线程的方式,因为可以使用共享的全局变 ,所以线程间的通信(数据交换)变得非常高效。Hello World(线程创建、结束、等待)线程创建、结束、等待)创建线程创建线程 pthread_create线程创建函数包含四个变,分别为: 1.
3、一个线程变名,被创建线程的标识 2. 线程的属性指针,缺省为 NULL即可 3. 被创建线程的程序代码 4. 程序代码的参数 For example: pthread_t thrd1 pthread_attr_t attr void thread_function(void argument) char *some_argumentpthread_create(结束线程结束线程 pthread_exit线程结束调用实例:pthread_exit(void *retval); /retval用于存放线程结束的退出状态线程等待线程等待 pthread_joinpthread_create调用成功以
4、后,新线程和线程谁先执行,谁后执行用户是知道的,这一块取决与操作系 统对线程的调度,如果我们需要等待指定线程结束,需要使用pthread_join函数,这个函数实际上类似与多 进程编程中的waitpid。 举个例子,以下假设 A 线程调用 pthread_join 试图去操作B线程,该函数将A线程 阻塞,直到B线程退出,当B线程退出以后,A线程会收集B线程的返回码。 该函数包含两个参数:pthread_t th /th是要等待结束的线程的标识 void *thread_return /指针thread_return指向的位置存放的是终止线程的返回状态。调用实例:pthread_join(thr
5、d1, NULL);example1:1 / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *2 F i l e N a m e : t h r e a d _ h e l l o _ w o r l d . c 3 A u t h o r : c o u l d t t ( f y b y )4 M a i l : f u y u n b i y i g
6、 m a i l . c o m5 C r e a t e d T i m e : 2 0 1 3 1 2 月1 4 日 星期六 1 1 时4 8 分5 0 秒6 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /7 8 # i n c l u d e 9 # i n c l u d e 1 0 # i n c l u d e 1 1 1 2 v o i d
7、 p r i n t _ m e s s a g e _ f u n c t i o n ( v o i d * p t r ) 1 3 1 4 i n t m a i n ( )1 5 1 6 i n t t m p 1 , t m p 2 1 7 v o i d * r e t v a l 1 8 p t h r e a d _ t t h r e a d 1 , t h r e a d 2 1 9 c h a r * m e s s a g e 1 = “ t h r e a d 1 “ 2 0 c h a r * m e s s a g e 2 = “ t h r e a d 2 “
8、2 1 2 2 i n t r e t _ t h r d 1 , r e t _ t h r d 2 2 3 2 4 r e t _ t h r d 1 = p t h r e a d _ c r e a t e ( 成功返回0,失败返回1 参数 sem:指向信号结构的一个指针 pshared: 是0的时候,该信号在进程间共享,否则只能为当前进程的所有线程们共享 value:信号的初始值 信号减1操作,当sem=0的时候该函数会堵塞 int sem_wait(sem_t *sem); 成功返回0,失败返回1 参数 sem:指向信号的一个指针 信号加1操作 int sem_post(sem_t
9、 *sem); 参数与返回同上 销毁信号 int sem_destroy(sem_t *sem);参数与返回同上 代码示例代码示例1 / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *2 F i l e N a m e : s e m . c3 A u t h o r : c o u l d t t ( f y b y )4 M a i l : f u
10、y u n b i y i g m a i l . c o m 5 C r e a t e d T i m e : 2 0 1 3 1 2 月1 5 日 星期日 1 9 时2 5 分0 8 秒6 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /7 8 # i n c l u d e 9 # i n c l u d e 1 0 # i n c l u d e
11、 1 1 # i n c l u d e 1 2 1 3 # d e f i n e M A X S I Z E 1 01 4 1 5 i n t s t a c k M A X S I Z E 1 6 i n t s i z e = 0 1 7 s e m _ t s e m 1 8 1 9 / / 生产者2 0 v o i d p r o v i d e _ d a t a ( v o i d ) 2 1 i n t i 2 2 f o r ( i = 0 i M A X S I Z E i + + ) 2 3 s t a c k i = i 2 4 s e m _ p o s t ( &
12、 s e m ) / / 为信号加12 5 2 6 2 7 2 8 / / 消费者2 9 v o i d h a n d l e _ d a t a ( v o i d ) 3 0 i n t i 3 1 w h i l e ( ( i = s i z e + + ) M A X S I Z E ) 3 2 s e m _ w a i t ( & s e m ) 3 3 p r i n t f ( “ 乘法: % d X % d = % d n “ , s t a c k i , s t a c k i , s t a c k i * s t a c k i ) 3 4 s l e e p (
13、 1 ) 3 5 3 6 3 7 3 8 i n t m a i n ( v o i d ) 3 9 4 0 p t h r e a d _ t p r o v i d e r , h a n d l e r 4 1 4 2 s e m _ i n i t ( & s e m , 0 , 0 ) / / 信号初始化4 3 p t h r e a d _ c r e a t e ( & p r o v i d e r , N U L L , ( v o i d * ) h a n d l e _ d a t a , N U L L ) 4 4 p t h r e a d _ c r e a t
14、e ( & h a n d l e r , N U L L , ( v o i d * ) p r o v i d e _ d a t a , N U L L ) 4 5 p t h r e a d _ j o i n ( p r o v i d e r , N U L L ) 4 6 p t h r e a d _ j o i n ( h a n d l e r , N U L L ) 4 7 s e m _ d e s t r o y ( & s e m ) / / 销毁信号4 8 4 9 r e t u r n 0 5 0 运行结果:运行结果:因为信号机制的存在,所以代码在handle_dat