簡體   English   中英

Linux和C,程序錯誤

[英]Linux and C, program errors

我正在嘗試更改一些代碼以使用“線程”而不是“ forks”。 這是我想出的代碼,但是有一條錯誤消息,我不確定為什么。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>

#define N 2 /* define the total number of processes we want */

/* Set global variable */
float total=0;

/* compute function just does something. */
int compute()
{
    int i;
    float oldtotal=0, result=0;
    /* for a large number of times just square root and square
    the arbitrary number 1000 */

    for(i=0;i<2000000000;i++)
    {
        result=sqrt(1000.0)*sqrt(1000.0);
    }

    /* Print the result  should be no surprise */
    printf("Result is %f\n",result);

    /* We want to keep a running total in the global variable total */
     oldtotal = total;
     total = oldtotal + result;

    /* Print running total so far. */
    printf("Total is %f\n",total);

    return(0);
}

void* thread_procedure(void* param)
{
    int i = (int)param;

    /* give a message about the proc ID */
    printf("Process Id for process %d is %d\n",i,getpid());
    /* call the function to do some computation. If we used sleep
    The process would simply sleep. We do not want that */
    compute();

    return NULL;
}

int main()
{
    int i, j;
    pthread_t thread[N];        
    float result=0;
    printf("\n"); /* bit of whitespace */

    /* We want to loop to create the required number of processes
    Note carefully how only the child process is left to run */
    for(i=0;i<N;i++)
    {
        /* start new thread and catch it if it/one fails */
        j = pthread_create(&thread[i], NULL, &thread_procedure, (void*)i);

        if (j)
        {
            printf("Error");
            exit(1);
        }
    }

    /* joining with threads */
    for(i=0;i<N;i++)
        pthread_join(thread[i], NULL);

    /* nothing else to do so end main function (and program) */
    return 0;
}

這是我收到的錯誤,我不理解

practical2b.c: In function ‘thread_procedure’:
practical2b.c:39:10: warning: cast from pointer to integer of different size     
[-Wpointer-to-int-cast]
  int i = (int)param;
          ^ 
practical2b.c: In function ‘main’:
practical2b.c:62:59: warning: cast to pointer from integer of different size     
[-Wint-to-pointer-cast]
   j = pthread_create(&thread[i], NULL, &thread_procedure, (void*)i);
                                                       ^
/tmp/cc9tHCVO.o: In function `main':
practical2b.c:(.text+0x11c): undefined reference to `pthread_create'
practical2b.c:(.text+0x168): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status

修復了編譯器提出的所有錯誤/警告並合並了一些早期注釋之后,代碼將如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>

#define N 2 /* define the total number of processes we want */

/* Set global variable */
float total=0.0f;

/* compute function just does something. */
int compute()
{
    int i;
    float result=0.0f;
    /* for a large number of times just square root and square
    the arbitrary number 1000 */

    for(i=0;i<2000000000;i++)
    {
        result=sqrt(1000.0)*sqrt(1000.0);
    }

    /* Print the result  should be no surprise */
    printf("Result is %f\n",result);

    /* We want to keep a running total in the global variable total */ 
    total += result;

    /* Print running total so far. */
    printf("Total is %f\n",total);

    return(0);
} // end function: compute


void* thread_procedure(void* param)
{
    int i = *(int*)param;

    /* give a message about the proc ID */
    printf("Process Id for process %d is %d\n",i,getpid());
    /* call the function to do some computation. If we used sleep
    The process would simply sleep. We do not want that */
    compute();

    return NULL;
}

int main()
{
    int i, j;
    pthread_t thread[N];        
    printf("\n"); /* bit of whitespace */

    /* We want to loop to create the required number of processes
    Note carefully how only the child process is left to run */
    for(i=0;i<N;i++)
    {
        /* start new thread and catch it if it/one fails */
        j = pthread_create(&thread[i], NULL, &thread_procedure, (void*)&i);

        if (j)
        {
            printf("Error");
            exit(1);
        }
    }

    /* joining with threads */
    for(i=0;i<N;i++)
        pthread_join(thread[i], NULL);

    /* nothing else to do so end main function (and program) */
    return 0;
} // end function: main

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM