2011-11-05 57 views
5

Tôi là người Hàn Quốc và tôi không giỏi tiếng Anh nhưng nếu bạn cho tôi một bình luận ở đó
Tôi sẽ rất hài lòng và sẽ cố gắng hiểu nó.pthread (lỗi phân đoạn)

Tôi đã tạo, ví dụ: 10 chuỗi và cố gắng tham gia sau khi tạo và trả về giá trị.
Nhưng khi tôi tham gia chủ đề cuối cùng, tôi nhận được lỗi phân đoạn.

Kết quả đi ra như thế này ..

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) 

khi tôi tạo ra 4 đề nó giống như

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) 

tôi dường như không thể tìm thấy lý do tại sao.

#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

Tôi không thể tạo lại điều này, tôi đã thử chủ đề 2 và 4. Nó hoạt động hoàn hảo, ngay cả bên trong Valgrind. Bạn có thể cho chúng tôi biết điều gì khác về vấn đề này không? – VolatileDream

+1

Bạn đã thử một trình gỡ lỗi chưa? gdb là bạn của bạn. – vanza

+1

Chào mừng bạn đến với SO. :-) –

Trả lời

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

Bạn chỉ được phân bổ không gian cho hai yếu tố ở đây, vì vậy nếu bạn khởi động hơn 2 chủ đề bạn sẽ chạy ra khỏi cuối của mảng và có khả năng sụp đổ hoặc bị hỏng stack.

Ngoài ra:

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

status là một int, không phải là một void *; cố gắng điều này sẽ cố gắng lưu trữ một void * trong một int. Trên nhiều nền tảng 64 bit, điều này cũng sẽ tràn (vì void * sẽ là 8 byte trong khi int là 4). Thực hiện status a void * và ngừng thử bỏ các lỗi trình biên dịch như thế này. Chúng là lỗi vì một lý do.

+0

khi tôi khởi chạy hơn 2 chủ đề, tôi đã thay đổi các số đó. – IKS

+0

Điểm tốt, nhưng chúng tôi vẫn không thể giải thích segfault trên 2 chủ đề mặc dù. – VolatileDream

+0

@IKS, bạn sẽ phải hiển thị mã mà bạn đã thay đổi những con số đó, bạn hoàn toàn có thể quên thay đổi một số. Tốt hơn, hãy bắt đầu sử dụng '# define' hoặc một biến để xác định có bao nhiêu luồng để khởi chạy, và có cả vòng lặp và phân bổ mảng sử dụng biến/macro này, để ngăn không nhất quán. – bdonlan