0

pthread ライブラリでスレッドを作成しようとしています。コンパイルは gcc -o -pthread file file.c で問題ありません

しかし、コードを実行すると、セグメンテーション違反が発生します。何が問題なのかわかりません。教科書に載っているコードを実行して学習しようとしましたが、今迷っています。誰でも助けることができますか?コードは以下のとおりです...非常に基本的なものですが、はい、助けてください。

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

int sum;
void *runner(void *param);

int main (int argc, char *argv[])
{
    pthread_t tid;
    pthread_attr_t attr;
    //printf("Am I here..?\n");
    if (argc!=2)
    {
        fprintf(stderr, "usage: a.out ...\n");
        return -1;
    }

    if (atoi(argv[1] < 0))
    {
        fprintf(stderr, "%d must be >= 0\n", atoi(argv[1]));
        return -1;
    }



    pthread_attr_init(&attr);
    pthread_create(&tid, &attr, runner, argv[1]);
    pthread_join(tid, NULL);

    printf("sum = %d\n", sum);
}

void *runner(void *param)
{
    extern int sum;
    int i, upper=atoi(param);
    sum=0;

    for(i=1; i<= upper; i++)
        sum+=i;

    pthread_exit(0);
}
4

2 に答える 2

3

コンパイラの警告をオンにして、注意深く調べてください。

が含まれていないstdlib.hため、atoi宣言されておらreturnず、から何も取得してrunnerいませんが、 を返すと宣言していますvoid*

しかし、主な問題は次の行です。

if (atoi(argv[1] < 0))

argv[1] < 00はまたはに評価され1ますが、これらは の引数として必要なものではありませんatoi。あなたが欲しかったのは:

if (atoi(argv[1]) < 0)

適切な警告が有効になっていれば、コンパイラがこれらすべての問題を示している可能性が高くなります。

于 2012-10-13T09:47:21.943 に答える
1

ブラケットの位置を間違えました:

変化する:

if (atoi(argv[1] < 0))

に:

if (atoi(argv[1]) < 0)
于 2012-10-13T09:46:45.080 に答える