JaryJary
JaryJary
采纳率100%
2015-09-19 11:00 阅读 4.5k
已采纳

多线程挂掉----哪个大神可以解决下,多谢啦!

30

1 #include
2 #include
3 #include
4 #include
5 #define PAI 3.14159
6 void* area(void* arg){
7 double r = (double)arg;
8 double* s=malloc(sizeof(double));
9 s = PAI * r * r;
10 return s;
11 }
12 int main(void) {
13 printf("r=");
14 double r;
15 scanf("%lf", &r);
16 pthread_t tid;
17 int error=pthread_create(&tid, NULL, area, &r);
18 if(error){
19 errno=error;
20 printf("%m\n");
21 }else {
22 printf("pthread_create success\n");
23 }
24 #if 0
25 double
a;
26 pthread_join(tid, (void**)&a);
27 printf("s=%g\n", a);
28 free(a);
29 a=NULL;
30 #endif
31 #if 0
32 double
* a = (double**)malloc(sizeof(double));
33 pthread_join(tid, (void**)a);
34 printf("s=%g\n", (double)a);
35 free(*a);
36 a=NULL;
37 free(a);
38 a=NULL;
39 #endif
40 #if 0
40 #if 0
41 double
b=(double*)malloc(sizeof(double));
42 double** a=&b;
43 int error1=pthread_join(tid, (void**)a);
44 if(error1){
45 errno=error1;
46 printf("%m\n");
47 }
48 printf("s=%g\n", (double)a);
49 free(*a);
50 a=NULL;
51 free(b);
52 b=NULL;
53 #endif
54 #if 1
55 double
* a;
56 int error1=pthread_join(tid, (void**)a);
57 if(error1){
58 errno=error1;
59 printf("%m\n");
60 }
61 printf("s=%g\n", (double)a);
62 free(*a);
63 *a=NULL;
64 #endif
65 return 0;
66 }

执行结果 :

r=4
pthread_create success
段错误 (核心已转储)

gdb跟踪调试结果:

54 #if 1
55 double** a;
56 int error1=pthread_join(tid, (void**)a);
57 if(error1){
58 errno=error1;
59 printf("%m\n");
60 }
61 printf("s=%g\n", (double)a);
62 free(*a);
63 *a=NULL;
(gdb) l
64 #endif
65 return 0;
66 }
(gdb) b 54
Breakpoint 1 at 0x8048689: file ret.c, line 54.
(gdb) r
Starting program: /home/liushiwei/liushiwei/unix/14/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".
r=3
[New Thread 0xb7dffb40 (LWP 7045)]
pthread_create success
[Thread 0xb7dffb40 (LWP 7045) exited]

Breakpoint 1, main () at ret.c:56
56 int error1=pthread_join(tid, (void**)a);
(gdb) p a
$1 = (double **) 0x8048709
(gdb) p *a
$2 = (double *) 0x18ebc381
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0xb7fb2e59 in pthread_join () from /lib/i386-linux-gnu/libpthread.so.0
(gdb) c
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb)

注意:前面三个#if 0 到#endif 都可以执行成功,但最后一个#if 1 到#endif,段错误,请大神帮帮小弟,已经纠结几天了,不知道怎么解决。谢谢!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

10条回答 默认 最新

  • 已采纳
    csdnliming147 蚂蚁de臂膀 2015-09-20 14:44

    一级指针也要捆绑存储区呀

    点赞 评论 复制链接分享
  • liu5320102 liu5320102 2015-09-19 12:55

    double* a;
    56 int error1=pthread_join(tid, (void**)a);

    指针值为空...没有存储空间...

    点赞 评论 复制链接分享
  • wudaomen wudaomen 2015-09-20 00:20

    你这代码真够乱的,报段错误多为数组越界,指针使用错误,指针未分配存储空间,你好好看看你出问题的代码

    点赞 评论 复制链接分享
  • csdnliming147 蚂蚁de臂膀 2015-09-20 02:46

    55 double* a
    应该是这里的问题,下面代码运行之前没有给申请空间。
    给个内存空间试试吧。

    点赞 评论 复制链接分享
  • csdnliming147 蚂蚁de臂膀 2015-09-20 02:48

    ps:觉得你的代码中好多用法都没有见过,你是不是传说中的大神、高手?

    点赞 评论 复制链接分享
  • JaryJary JaryJary 2015-09-20 05:52

    sorry,我没仔细看代码,抄错好多,下面是整理后的代码,不必看前三个#if 0到对应的#endif之间的代码 (这三段代码都是调试用的,不会执行),
    只看最后一个 #if 1 到最后一个 #endif 之间的代码,为什么在第56行报段错误?
    pthread_join()函数的第二个参数是线程过程函数的返回值的地址---输出参数。
    就是说,我如果声明一个二级指针,如果我直接用malloc()分配堆内存,给它初始化,不会有问题,但如果不初始化,就不可以(一级指针不用初始化也行)。

    1 #include
    2 #include
    3 #include
    4 #include
    5 #define PAI 3.14159
    6 void* area(void* arg){
    7 double r = (double)arg;
    8 double* s=malloc(sizeof(double));
    9 s = PAI * r * r;
    10 return s;
    11 }
    12 int main(void) {
    13 printf("r=");
    14 double r;
    15 scanf("%lf", &r);
    16 pthread_t tid;
    17 int error=pthread_create(&tid, NULL, area, &r);
    18 if(error){
    19 errno=error;
    20 printf("%m\n");
    21 }else {
    22 printf("pthread_create success\n");
    23 }
    24 #if 0
    25 double
    a;
    26 pthread_join(tid, (void**)&a);
    27 printf("s=%g\n", a);
    28 free(a);
    29 a=NULL;
    30 #endif
    31 #if 0
    32 double
    * a = (double**)malloc(sizeof(double));
    33 pthread_join(tid, (void**)a);
    34 printf("s=%g\n", (double)a);
    35 free(*a);
    36 a=NULL;
    37 free(a);
    38 a=NULL;
    39 #endif
    40 #if 0
    41 double
    b=(double*)malloc(sizeof(double));
    42 double** a=&b;
    43 int error1=pthread_join(tid, (void**)a);
    44 if(error1){
    45 errno=error1;
    46 printf("%m\n");
    47 }
    48 printf("s=%g\n", (double)a);
    49 free(*a);
    50 a=NULL;
    51 free(b);
    52 b=NULL;
    53 #endif
    54 #if 1
    55 double
    * a;
    56 int error1=pthread_join(tid, (void**)a);
    57 if(error1){
    58 errno=error1;
    59 printf("%m\n");
    60 }
    61 printf("s=%g\n", (double)a);
    62 free(*a);
    63 *a=NULL;
    64 #endif
    65 return 0;
    66 }

    GDB调试没有变化中,还是找走到第56行, 系统发SIGSEGV信号(段错误)。哪个大神,帮一下,谢谢!。

    点赞 评论 复制链接分享
  • JaryJary JaryJary 2015-09-20 06:14

    妹的!!!!!,重新整理过后的代码还是有错误,粘贴时,粘贴板会把** 粘贴成* ,再次重新整理一次,以下面的代码为准。

    1 #include
    2 #include
    3 #include
    4 #include
    5 #define PAI 3.14159
    6 void* area(void* arg){
    7 double r = (double)arg;
    8 double* s=malloc(sizeof(double));
    9 s = PAI * r * r;
    10 return s;
    11 }
    12 int main(void) {
    13 printf("r=");
    14 double r;
    15 scanf("%lf", &r);
    16 pthread_t tid;
    17 int error=pthread_create(&tid, NULL, area, &r);
    18 if(error){
    19 errno=error;
    20 printf("%m\n");
    21 }else {
    22 printf("pthread_create success\n");
    23 }
    24 #if 0
    25 double
    a;
    26 pthread_join(tid, (void**)&a);
    27 printf("s=%g\n", a);
    28 free(a);
    29 a=NULL;
    30 #endif
    31 #if 0
    32 double
    * a = (double**)malloc(sizeof(double));
    33 pthread_join(tid, (void**)a);
    34 printf("s=%g\n", (double)a);
    35 free(*a);
    36 a=NULL;
    37 free(a);
    38 a=NULL;
    39 #endif
    40 #if 0
    41 double
    b=(double*)malloc(sizeof(double));
    42 double** a=&b;
    43 int error1=pthread_join(tid, (void**)a);
    44 if(error1){
    45 errno=error1;
    46 printf("%m\n");
    47 }
    48 printf("s=%g\n", (double)a);
    49 free(*a);
    50 a=NULL;
    51 free(b);
    52 b=NULL;
    53 #endif
    54 #if 1
    55 double
    * a;
    56 int error1=pthread_join(tid, (void**)a);
    57 if(error1){
    58 errno=error1;
    59 printf("%m\n");
    60 }
    61 printf("s=%g\n", (double)a);
    62 free(*a);
    63 *a=NULL;
    64 #endif
    65 return 0;
    66 }

    点赞 评论 复制链接分享
  • JaryJary JaryJary 2015-09-20 06:32

    #include
    #include
    #include
    #include
    #define PAI 3.14159
    void* area(void* arg){
    double r = (double)arg;
    double* s=malloc(sizeof(double));
    s = PAI * r * r;
    return s;
    }
    int main(void) {
    printf("r=");
    double r;
    scanf("%lf", &r);
    pthread_t tid;
    int error=pthread_create(&tid, NULL, area, &r);
    if(error){
    errno=error;
    printf("%m\n");
    }else {
    printf("pthread_create success\n");
    }
    #if 0
    double
    a;
    pthread_join(tid, (void**)&a);
    printf("s=%g\n", a);
    free(a);
    a=NULL;
    #endif
    #if 0
    double
    * a = (double**)malloc(sizeof(double));
    pthread_join(tid, (void**)a);
    printf("s=%g\n", (double)a);
    free(*a);
    a=NULL;
    free(a);
    a=NULL;
    #endif
    #if 0
    double
    b=(double*)malloc(sizeof(double));
    double** a=&b;
    int error1=pthread_join(tid, (void**)a);
    if(error1){
    errno=error1;
    printf("%m\n");
    }
    printf("s=%g\n", (double)a);
    free(*a);
    a=NULL;
    free(b);
    b=NULL;
    #endif
    #if 1
    double
    * a;
    int error1=pthread_join(tid, (void**)a);
    if(error1){
    errno=error1;
    printf("%m\n");
    }
    printf("s=%g\n", (double)a);
    free(*a);
    *a=NULL;
    #endif
    return 0;
    }

    我再试一次 ,看行不行,粘贴板会不会把 ** 粘成 *.

    点赞 评论 复制链接分享
  • JaryJary JaryJary 2015-09-20 06:58

    pthread_join1
    pthread_join2
    pthread_join3

    妹的!!!!!,上面两个代码粘贴时,粘贴板还是会把** 粘贴成* ,请以下面图片里的代码为准,pthread_join1(1行----31行);pthread_join2(31行----61行);pthread_join2(37行----67行)。谢谢。

    点赞 评论 复制链接分享
  • csdnliming147 蚂蚁de臂膀 2015-09-20 07:18

    。。。。。。。
    。。。。。。。。。。
    你先试一试,55行double** a ;之后申请个内存空间,然后再调用pthread_join()函数。
    因为你声明了double** a 的指针,但并没有让它指向一个有效的内存空间,所以在调用pthread_join()函数是给你返回数据时发生错误。

    你先试试吧。

    点赞 评论 复制链接分享

相关推荐