3

我昨天问了一个问题在多线程服务器中使用套接字。在这个问题中,我描述了多线程服务器中 Solaris 下的分段错误。现在我找到了错误的核心并编写了代码,简短地演示了它:

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


int main(int argc, char *argv[])
{
    pthread_attr_t *attr;

    attr = (pthread_attr_t *)malloc(sizeof(pthread_attr_t));
    pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED);

    malloc(0);
    malloc(0); //Segmentation fault there

    return 0;
}

第二个 malloc 因分段错误而崩溃。虽然此代码正常执行:

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


int main(int argc, char *argv[])
{
    pthread_attr_t *attr;

    attr = (pthread_attr_t *)malloc(sizeof(pthread_attr_t));
    // pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED);

    malloc(0);
    malloc(0);

    return 0;
}

你能解释一下错误的原因吗?

PS:我用gcc -pthreads -lpthread -D_REENTRANT钥匙编译。

4

1 回答 1

4

从上的文档pthread_attr_setdetachstate()

如果 pthread_attr_getdetachstate() 或 pthread_attr_setdetachstate() 的 attr 参数指定的值不引用已初始化的线程属性对象,则行为未定义。

参数指向的pthread_attr_t对象可能包含指向 pthreads 库维护的某些状态的指针。attr如果尚未初始化,则该指针将是垃圾,因此pthread_attr_setdetachstate()调用可能会破坏堆。

查看pthread_attr_init()函数以了解如何正确初始化属性对象。

于 2013-05-15T07:11:33.877 回答