Linux多线程编程计算pi值
操作系统原理课程LAB2
使用pthread系列函数进行多线程编程计算pi的近似值。
一、实验原理
1. 计算公式
2. pthread.h 包含pthread系列函数的头文件
pthread_create() 函数原型:
1
int pthread_create(pthread_t * thread, const pthread_arrt_t* attr,void*(*start_routine)(void *), void* arg);
各参数含义:
(1) thread是线程标识符,类型为int;
(2) attr用于设置线程属性,如果为NULL则表示为默认属性;
(3) start_routine和arg表示新线程运行的函数和参数;
(4) 该函数返回值:成功返回0,失败返回错误号。pthread_join() 函数原型:
1
void pthread_join(pthread_t thread,void ** retval);
各参数含义:
(1) thread为新线程的标识符;
(2) retval有如下情况:- 如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值。
- 如果thread线程被别的线程调用pthread_cancel异常终掉,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED。
- 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。 如果对thread线程的终止状态不感兴趣,可以传NULL给value_ptr参数。
函数功能:调用该函数的线程将被挂起等待,直到标识符为thread的线程结束运行。
- pthread_exit() 函数原型:
1
void pthread_exit(void * retval);
各参数含义:
(1)retval是void *类型,其它线程可以调用pthread_join获得这个指针。需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是由malloc分 配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
(2)pthread_exit函数通过retval参数向线程的回收者传递其退出信息。它执行之后不会返回到调用者,且永远不会失败。
3. 计算过程与线程互斥操作
假设线程数量为t,则可将上述公式中的N平均分为t份,每份交给一个线程运行,最后再将计算得到的结果进行累加,在这里需要注意,累加的过程中涉及到了对同一变量的修改,出现临界区的问题,需要加锁进行解决,可使用pthread_mutex_lock(&lock) 和 *pthread_mutex_unlock(&lock)*。
4. 编译命令示例
1 | gcc test.c –o test –lpthread |
二、代码
1 |
|
Linux多线程编程计算pi值