多线程程序POSIX

时间:2015-10-23 01:17:58

标签: c arrays multithreading pthreads posix

这个代码用于使用多线程的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;
   }

2 个答案:

答案 0 :(得分:1)

代码未编译

您必须在语句之前删除结束括号:

  

返回0;

假设您的程序在program.c中

你这样编译:

  
      
  1. gcc -g -Wall -Wextra -pedantic -c p.c -o program.o -I。

  2.   
  3. gcc -g program.o -o program -lpthread

  4.   

选项-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;
}