一、实验内容
二、知识学习
>>pthread_create函数
*原型:**int pthread_create((pthread_t *thread, pthread_attr_t *attr, void (start_routine)(void ), void *arg)
用法:#include <pthread.h>
功能:创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。
说明: thread:线程标识符;
attr:线程属性设置;
start_routine:线程函数的起始地址;
arg:传递给start_routine的参数;
返回值:成功回0;出错,返回-1。
>>pthread_join函数
原型:**int pthread_join(pthread_t thread, (void )value_ptr);
用法:#include <pthread.h>
功能:阻塞当前线程,直到thread对应的线程退出
说明: thread:等待退出线程的线程号。
value_ptr:退出线程的返回值。
>>pthread_exit函数
原型: void pthread_exit(void *retval
使用:#include <pthread.h>
功能:使用函数pthread_exit退出线程,这是线程的主动行为;由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_()函数来同步并释放资源。
**说明:**retval:pthread_exit()调用线程的返回值,可由其他函数如pthread_join来检索获取。
>>编译方法
三、实验代码
#include <stdio.h>
#include <pthread.h>
#define MAX_SEQUENCE 100
//一组数据,用于创建线程时作为参数传入
struct Data{
int num; //斐波那契数列的项数
int Fibo[MAX_SEQUENCE];//最大容量,斐波那契数列
};
void *Fibonacci(void *data){//获得斐波那契数列
struct Data *tmp = (struct Data*)data;//转化为实际类型
int i;
if( tmp->num == 0 ){
return;
}
if( tmp->num == 1 ){
tmp->Fibo[0] = 0;
return;
}
tmp->Fibo[0] = 0;
tmp->Fibo[1] = 1;
for( i=2; i < tmp->num; i++ ){
tmp->Fibo[i] = tmp->Fibo[i-1] + tmp->Fibo[i-2];
}
}
int main(){
struct Data data;
pthread_t th;//线程标识符
int ret; //pthread的返回值 ret = 0,创建线程成功
int n;
int i;
printf("The fibonacci produce programe!\nPlease input an number within 1~200: ");
scanf("%d", &n);
if(n < 0 || n > 200){
printf("Your input is error.");
return -1;
}
data.num = n;//赋值
//create a thread
ret = pthread_create(&th, NULL, Fibonacci, (void *)&data);
if( ret != 0 ){
printf("Create thread error!\n");
return -1;
}
//阻塞调用线程
pthread_join( th, NULL);
//输出斐波那契数列
if( data.num == 0){
printf("Nothing output.");
}
else{
printf("The Fibonacci %d items are:\n", data.Fibo[i]);
}
printf("\n");
}
}