c - 使用 pthreads 和 malloc

标签 c segmentation-fault pthreads malloc solaris

我问了一个问题Using sockets in multithread server昨天。在这个问题中,我描述了多线程服务器中 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;
}

能否请您解释一下错误的原因?

P.S.:我使用 gcc -pthreads -lpthread -D_REENTRANT 键进行编译。

最佳答案

来自docs on pthread_attr_setdetachstate() :

The behavior is undefined if the value specified by the attr argument to pthread_attr_getdetachstate() or pthread_attr_setdetachstate() does not refer to an initialized thread attributes object.

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

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

关于c - 使用 pthreads 和 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16523204/

相关文章:

c - 从文件读取7M数据失败

CvLoadImage 函数和列表

使用指向 uint64_t 的指针复制 C 中的自定义字符串会导致段错误

linux - Linux 上的 pthread_mutex_timedlock

12bit转十进制

c - 如何使用_beginthreadex 启动一个线程?

c++ - 段错误和神秘的循环行为

c - 分段故障错误(核心已转储)

pthreads - Tcl:递归删除目录 - 使用线程提高性能

c - 为什么需要在 C 中初始化 pthread 互斥锁?