【问题标题】:C thread: SEGFAULT when trying to read thread's return valueC线程:尝试读取线程的返回值时的SEGFAULT
【发布时间】:2015-12-19 09:36:54
【问题描述】:

我需要opnsrc() 函数来返回它读取的字节数。当我尝试运行下面的代码时,会引发 SEGFAULT。 GDB 显示罪魁祸首是来自opnsrc()int *rvi = (int *) rvp;。我打算rvp 存储来自opnthrd() 的返回值。如何解决这个问题?谢谢。

static char iobfr[512];

static void *
opnthrd(void *argp)
{
    memset(iobfr, '\0', 512);
    char *fname = (char *) argp;
    FILE *fp = fopen(fname, "r");
    if (!fp) {
        pthread_exit((void *) -1);
    }
    int i = 0;
    int c;
    for (c = fgetc(fp); c != EOF; c = fgetc(fp)) {
        iobfr[i++] = c;
    }
    iobfr[i] = '\0';
    fclose(fp);
    fp = NULL;
    pthread_exit((void *) i);   
}

static int
opnsrc(char *fnam)
{
    pthread_t thrd;
    void *rvp;
    int rc = pthread_create(&thrd, NULL, opnthrd, fnam);
    if (0 != rc) {
        return (-1);
    }
    rc = pthread_join(thrd, &rvp);
    if (0 != rc) {
        return (-1);
    }   
    if (!rvp) {
        return (-1);
    }
    int *rvi = (int *) rvp;
    return *rvi;
}

int main()
{
    int ccnt = opnsrc("/var/tmp/hello.pl");
    printf("%d bytes read\n", ccnt);
    return 0;
}

【问题讨论】:

    标签: c multithreading io


    【解决方案1】:

    这里:

    pthread_exit((void *) i);   
    

    您将i 的值(不是地址)作为线程返回值传递。那么:

    rc = pthread_join(thrd, &rvp);
    int *rvi = (int *) rvp;
    

    现在您已将 i 中的值存储到 rvp 中,但随后您将其用作指针。它不是。

    【讨论】:

    • 所以我可以使用一些全局变量,例如static int i; 然后写pthread_exit(&i);?
    • @JanosTomaszi:只是代替int *rvi = (int *) rvp;int i = (int) rvp;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多