2022年多线程编程实例 .pdf
《2022年多线程编程实例 .pdf》由会员分享,可在线阅读,更多相关《2022年多线程编程实例 .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,若不为
2、 0 则说明创建线程失败。函数 pthread_join 用来等待一个线程的结束。函数原型为:extern int pthread_join _P (pthread_t _th, void *_thread_return); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数 pthread_exit 来实现。它的函数原型为:
3、extern void pthread_exit _P (void *_retval) _attribute_ (_noreturn_); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 最简单的线程程序:/* example.c*/ #include #include void thread(void) int i; for(i=0;i3;i+) printf(This is a pthread.n); int main(v
4、oid) 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+) printf(This is the main process.n); pthread_join (id,NULL); return (0); 输出是什么样子?名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
5、 - - - - 第 2 页,共 11 页 - - - - - - - - - 和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,可以方便的获得、 修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的线程访问相同的变量。许多函数是 不可重入 的,即同时不能运行一个函数的多个拷贝(除非使用不同的数据段)。在函数中声明的静态变量 常常带来问题,函数的返回值 也会有问题。因为如果返回的是函数内部静态声明的空间的地址,则在一个线程调用该函数得到地址后使用该地址指向的数据时,别的线程可能调用此函数并修改了这一段数据。在进程中共享的变量必须用关键字volati
6、le来定义,这是为了防止编译器在优化时(如gcc 中使用 -OX 参数)改变它们的使用方式。为了保护变量,我们必须使用信号量、互斥 等方法来保证我们对变量的正确使用。int square(volatile int *ptr) return *ptr * *ptr; 这个程序有什么错误?名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 这段代码的目的是用来返指针*ptr 指向值的平方,但是,由于*ptr 指向一个 volatile
7、 型参数,编译器将产生类似下面的代码:int square(volatile int *ptr) int a,b; a = *ptr; b = *ptr; return a * b; 由于 *ptr 的值可能被意想不到地改变,因此a 和 b 可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:long square(volatile int *ptr) int a; a = *ptr; return a * a; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4
8、 页,共 11 页 - - - - - - - - - 互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的。下面一段代码是一个读/写程序, 它们公用一个缓冲区,并且我们假定一个缓冲区只能保存一条信息。即缓冲区只有两个状态:有信息或没有信息。void reader_function ( void ); void writer_function ( void ); char buffer; int buffer_has_item=0; pthread_mutex_t mutex; struct timespec d
9、elay; void main ( void ) pthread_t reader; /* 定义延迟时间 */ delay.tv_sec = 2; delay.tv_nec = 0; /* 用默认属性初始化一个互斥锁对象*/ pthread_mutex_init (&mutex,NULL); pthread_create(&reader, pthread_attr_default, (void *)&reader_function), NULL); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年多线程编程实例 2022 多线程 编程 实例
限制150内