2011-11-05 90 views
5

我是韩国人,我不擅长英语,但如果你给我评价那里
我会很高兴,并会尝试去理解它。pthread(分割错误)

我创建了例如10个线程,并在创建后尝试加入它们并返回值。
但是,当我加入最后一个线程时,出现了分段错误。

结果出来这样的..

Before Thread 1 create 
After Thread 1 create 
Before Thread 0 create 
After Thread 0 create 
Before Thread 1 join 
After Thread 1 join 
Before Thread 0 join 
Segmentation Fault(core dumped) 

当我创建4个线程就好像

Before Thread 3 create 
After Thread 3 create 
Before Thread 2 create 
After Thread 2 create 
Before Thread 1 create 
After Thread 1 create 
Before Thread 0 create 
After Thread 0 create 
Before Thread 3 join 
After Thread 3 join 
Before Thread 2 join 
After Thread 2 join 
Before Thread 1 join 
After Thread 1 join 
Before Thread 0 join 
Segmentation Fault(core dumped) 

我似乎无法找到原因。

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

pthread_mutex_t mutex_lock; 

struct arg_struct { 
     int a; 
     int b; 
}; 

void *t_function(void *data) { 
     pthread_mutex_lock(&mutex_lock); 

     struct arg_struct *arg = (struct arg_struct *)data; 
     long int s; 

     s = arg->a; 

     pthread_mutex_unlock(&mutex_lock); 

     return (void **)s; 
} 

int main() 
{ 
     int i; 

     pthread_t p_thread[2]; 
     int thr_id; 
     int status; 

     struct arg_struct arg[2]; 

     for(i = 1; i >= 0; i--) { 
       arg[i].a = i; 
       arg[i].b = i; 
     } 

     pthread_mutex_init(&mutex_lock, NULL); 

     for(i = 1; i >= 0; i--) { 
       printf("Before Thread %d create\n", i); 
       thr_id = pthread_create(&p_thread[i],NULL, t_function, (void *)&arg[i]); 
       printf("After Thread %d create\n", i); 
       usleep(1000); 
     } 

     int temp[2]; 

     for(i = 1; i >= 0; i--) { 
       printf("Before Thread %d join\n", i); 
       pthread_join(p_thread[i], (void**)&status); 
       printf("After Thread %d join\n", i); 
       temp[i] = status; 
     }i 

     printf("%d%d", temp[1], temp[0]); 

     pthread_mutex_destroy(&mutex_lock); 

     return 0; 
} 
+0

我不能重现这一点,我试过2和4线程。它的工作非常好,即使在Valgrind中也是如此。你能告诉我们关于这个问题的其他事吗? – VolatileDream

+1

您是否尝试过调试器? gdb是你的朋友。 – vanza

+1

欢迎来到SO。 :-) – 2012-01-11 00:36:54

回答

9
pthread_t p_thread[2]; 
    struct arg_struct arg[2]; 
    int temp[2]; 

你只分配空间,这里有两个要素,因此,如果您推出超过2个线程,你会跑出数组的结尾,并可能崩溃或损坏堆栈。

此外:

  pthread_join(p_thread[i], (void**)&status); 

statusint,而不是一个void *;尝试这将尝试在int中存储void *。在许多64位平台上,这也会溢出(因为void *将是8字节,而int是4)。使status a void *,并停止试图摆脱这样的编译器错误。他们是有原因的错误。

+0

当我启动2个以上的线程时,我改变了这些数字。 – IKS

+0

好点,但我们仍然无法解释2线程上的段错误。 – VolatileDream

+0

@IKS,那么您必须在代码中显示更改这些数字的位置,这完全可能导致您忘记更改数字。更好的方法是,开始使用'#define's或变量来定义要启动的线程数量,并且使用这个变量/宏来设置循环和数组分配,以防止出现不一致。 – bdonlan