多线程编程实例.pdf
《多线程编程实例.pdf》由会员分享,可在线阅读,更多相关《多线程编程实例.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编写 Linux 下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。函数 pthread_create 用来创建一个线程,它的原型为:extern int pthread_create _P(pthread_t*_thread,_const pthread_attr_t*_attr,void*(*_start_routine)(void*),void*_arg);第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。当创建线程成功时,函数返回 0,若不为 0 则说明创建线程失败。
2、函数 pthread_join 用来等待一个线程的结束。函数原型为:extern int pthread_join _P(pthread_t _th,void*_thread_return);第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数 pthread_exit 来实现。它的函数原型为:extern void pthre
3、ad_exit _P(void*_retval)_attribute_(_noreturn_);最简单的线程程序:/*example.c*/#include#include void thread(void)int i;for(i=0;i3;i+)printf(This is a pthread.n);int main(void)pthread_t id;int i,ret;ret=pthread_create(&id,NULL,(void*)thread,NULL);if(ret!=0)printf(Create pthread error!n);exit(1);for(i=0;i3;i+)
4、printf(This is the main process.n);pthread_join(id,NULL);return(0);输出是什么样子?文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:
5、CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I1
6、0E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE1
7、0Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7
8、N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6
9、 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X
10、10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文
11、档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的线程访问相同的变量。许多函数是 不可重入 的,即同时不能运行一个函数的多个拷贝(除非使用不同的数据段)。在函数中声明的静态变量 常常带来问题,函数的返回值 也会有问题。因为如果返回的是函数内部静态声明的空间的地址,则在一个线程调用该函数得到地址后使用该地址指向的
12、数据时,别的线程可能调用此函数并修改了这一段数据。在进程中共享的变量必须用关键字volatile来定义,这是为了防止编译器在优化时(如gcc 中使用-OX 参数)改变它们的使用方式。为了保护变量,我们必须使用信号量、互斥 等方法来保证我们对变量的正确使用。int square(volatile int*ptr)return*ptr*ptr;这个程序有什么错误?文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 Z
13、E10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5
14、O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3
15、J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY
16、7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E
17、2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q
18、10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2
19、J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2这段代码的目的是用来返指针*ptr 指向值的平方,但是,由于*ptr 指向一个 volatile 型参数,编译器将产生类似下面的代码:int square(volatile int*ptr)int a,b;a=*p
20、tr;b=*ptr;return a*b;由于*ptr 的值可能被意想不到地改变,因此a 和 b 可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:long square(volatile int*ptr)int a;a=*ptr;return a*a;文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1
21、ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U
22、5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A
23、3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:C
24、Y7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10
25、E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10Q10B1I10E2文档编码:CY7X10K9A3J6 HH9U5O7N2J1 ZE10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多线程 编程 实例
限制150内