关于pthread_create线程创建的断错误

vlinwanfeng 2017-04-03 04:24:56
在循环中调用pthread_create创建线程,同时使用pthread_detach分离线程,运行一段时间就会报断错误,好像pthread_create没返回就出现了段错误。请教各位大牛这种情况怎么处理才能解决。

源码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>

void *fn()
{
pthread_detach(pthread_self());
return NULL;
}

int main(void)
{
pthread_t tid;
for(int i=0; ;i++)
{
int err=pthread_create(&tid, NULL, fn, NULL);
if(err!=0)
{
printf("%s\n", strerror(err));
break;
}
}
return 0;
}

运行会出现:segfault at 7f9699a13d13 ip 00007f969c5e9e8f sp 00007ffcc3b63bb0 error 4 in libpthread-2.23.so[7f969c5e2000+18000]

...全文
756 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
vlinwanfeng 2017-04-10
  • 打赏
  • 举报
回复
引用 8 楼 sum_TW 的回复:
http://blog.csdn.net/sum_tw/article/details/68952050 参考一下
谢谢
vlinwanfeng 2017-04-10
  • 打赏
  • 举报
回复
引用 6 楼 cfjtaishan 的回复:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>

void *fn()
{
    pthread_detach(pthread_self());
    return NULL;
}

int main(void)
{
    pthread_t tid;
    int i;

    for (i = 0; ; i++) {
        int err = pthread_create(&tid, NULL, fn, NULL);
        if (err!=0) {
            printf("%s\n", strerror(err));
            break;
        }
        printf("i = %d\n", i);
    }
    return 0;
}
你是在那个平台上运行改程序,我在Linux下运行了,没有出现错误,一直在运行(通过查看i的值)。这是一个无限创建线程,并且线程会自动释放的程序。
看来是ubuntu的问题,我换centos试了下,确实可以一直创建线程,谢谢啦,但分数怎么给你呢?
自信男孩 2017-04-05
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>

void *fn()
{
    pthread_detach(pthread_self());
    return NULL;
}

int main(void)
{
    pthread_t tid;
    int i;

    for (i = 0; ; i++) {
        int err = pthread_create(&tid, NULL, fn, NULL);
        if (err!=0) {
            printf("%s\n", strerror(err));
            break;
        }
        printf("i = %d\n", i);
    }
    return 0;
}
你是在那个平台上运行改程序,我在Linux下运行了,没有出现错误,一直在运行(通过查看i的值)。这是一个无限创建线程,并且线程会自动释放的程序。
vlinwanfeng 2017-04-05
  • 打赏
  • 举报
回复
难道没人知道吗?
  • 打赏
  • 举报
回复
http://blog.csdn.net/sum_tw/article/details/68952050 参考一下
weixin_37891189 2017-04-05
  • 打赏
  • 举报
回复
引用 6楼自信男孩 的回复:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>

void *fn()
{
    pthread_detach(pthread_self());
    return NULL;
}

int main(void)
{
    pthread_t tid;
    int i;

    for (i = 0; ; i++) {
        int err = pthread_create(&tid, NULL, fn, NULL);
        if (err!=0) {
            printf("%s\n", strerror(err));
            break;
        }
        printf("i = %d\n", i);
    }
    return 0;
}
你是在那个平台上运行改程序,我在Linux下运行了,没有出现错误,一直在运行(通过查看i的值)。这是一个无限创建线程,并且线程会自动释放的程序。
谢谢解答。系统是Ubuntu 16.04lts,难道是系统的问题?
weixin_37891189 2017-04-04
  • 打赏
  • 举报
回复
引用 3楼欧阳春晖 的回复:
我的理解是线程不能分离自身,要由父线程进行分离
自身分离也是可以,而且在主线程中分离效果也是一样的
欧阳春晖 2017-04-04
  • 打赏
  • 举报
回复
我的理解是线程不能分离自身,要由父线程进行分离
weixin_37891189 2017-04-03
  • 打赏
  • 举报
回复
引用 1楼赵4老师 的回复:
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
这个试了,显示pthread create 有错,但不知道错在哪儿。
赵4老师 2017-04-03
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令

70,004

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧