这个代码用于使用多线程的Fibonacci序列,但它显示了我的错误。你可以检查并告诉我如何解决这个问题
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int arr[100];/* array*/
typedef struct {
int input;
int output[100];
} thread_args;
void *thread_func ( void *ptr )/*child thread */
{
int i = ((thread_args *) ptr)->input;
int x;
((thread_args *) ptr)->output[0]=0;
((thread_args *) ptr)->output[1]=1;
for(x=2;x<i;x++)
{
/* ((thread_args *) ptr)->output[x]=
((thread_args *) ptr)->output[x-1]
+((thread_args *) ptr)->output[x-2]; */
}
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t thread;
thread_args args;
int status;
int x;
int result;
int thread_result;
if (argc < 2) return 1;
int n = atoi(argv[1]);
args.input = n;
status = pthread_create(&thread,NULL,thread_func,(void*) &args );
// main can continue executing
// Wait for the thread to terminate.
pthread_join(thread, NULL);
for(x=0;x<n;x++)
{
arr[x]=args.output[x];/* get the result*/
printf("Fibonacci is %d.\n", arr[x]);/*print all numbers*/
}
}
return 0;
}
答案 0 :(得分:1)
代码未编译
您必须在语句之前删除结束括号:
返回0;
假设您的程序在program.c中
你这样编译:
gcc -g -Wall -Wextra -pedantic -c p.c -o program.o -I。
- 醇>
gcc -g program.o -o program -lpthread
选项-g用于调试代码
为了进行调试,我建议使用一些图形工具,如ddd或xxgdb(如果你愿意,可以使用其他工具)
当您不提供参数时,由于声明:
,您的程序将以代码1终止if(argc&lt; 2)返回1;
所以现在当我执行你的程序时这样:
./ a.out 5 (例如,找到n = 5的Fibonacci)
它给出了这个输出:
Fibonacci为0。
Fibonacci是1。
Fibonacci是32684。
Fibonacci为0。
Fibonacci为0。
如你所见,结果现在不好
函数 void * thread_func(void * ptr)似乎无法正常工作
答案 1 :(得分:1)
以下代码:
代码不会检查最大命令行值是否为100,您可以添加该检查
#include <stdio.h> // printf(), perror()
#include <stdlib.h> // exit(), EXIT_FAILURE
#include <pthread.h> // pthread_create(), pthread_exit(), pthread_join()
int arr[100];/* array*/
typedef struct
{
int input;
int output[100];
} thread_args;
void *thread_func ( void *ptr )/*child thread */
{
thread_args *arg = (thread_args *)ptr;
size_t i = (size_t)arg->input;
arg->output[0] = 0;
arg->output[1] = 1;
for( size_t x=2; x<i; x++ )
{
arg->output[x] = arg->output[x-2] + arg->output[x-1];
}
pthread_exit( NULL );
} // end function: thread_func
int main(int argc, char *argv[])
{
pthread_t thread;
thread_args args;
int status;
int x;
//int result;
//int thread_result;
if (argc < 2)
{
printf( "Usage: %s <maxFibonacci>\n", argv[0]);
exit( EXIT_FAILURE );
}
// implied else, argc is correct
int n = atoi(argv[1]);
if( n <= 0)
{// then command line argument not numeric or < 0
printf( "command line arguent: %s is not a valid positive int\n", argv[1]);
exit( EXIT_FAILURE );
}
// implied else, command line argument valid
args.input = n;
status = pthread_create(&thread,NULL,thread_func,(void*) &args );
if( status )
{ // then error occurred
perror( "phread_create failed to create thread" );
exit( EXIT_FAILURE );
}
// implied else, pthread_create was successful
// main can continue executing
// Wait for the thread to terminate.
pthread_join(thread, NULL);
for(x=0;x<n;x++)
{
arr[x]=args.output[x];/* get the result*/
printf("Fibonacci is %d.\n", arr[x]);/*print all numbers*/
}
return 0;
}