2012-06-15 34 views
5

Tôi đang làm việc trên một chương trình đa luồng và có câu hỏi về nơi xác định mutex.C nơi để xác định một mutex trong một chương trình đa luồng?

Thông tin có liên quan: chương trình có main.c nơi chúng tôi xác định hành động cụ thể theo đầu vào của người dùng. main gọi hàm master_function nằm trong tệp có tên master.c. Trong tập tin master.c chúng ta tạo ra N luồng cùng với một số hành động khác (không liên quan). Các chủ đề gọi một hàm có tên son_threads nằm trong tệp son.c và chúng cần sử dụng mutex khi chúng nhập vào vùng quan trọng (chỉnh sửa một số biến toàn cầu để ngăn chặn tình trạng chủng tộc). Một tệp khác tôi có là một type.h nơi tôi xác định một số biến toàn cục mà tôi cần sử dụng.

Tờ khai mutex là:

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 

Vì vậy, tôi đã cố gắng để xác định mutex trong tôi type.h do đó, nó có thể nhìn thấy các son.c tập tin. Khi tôi cố gắng biên dịch nó cho tôi lỗi. Đó là chính xác kể từ khi tôi xác định rằng mutex trong một số tập tin.

Nhưng tôi khá chắc chắn tôi không thể xác định mutex trong tệp son.c vì mỗi khi tôi tạo chuỗi đó, mutex sẽ được khởi tạo thành cài đặt mặc định của nó, không cho phép tôi sử dụng đúng cách. Không chắc chắn về điều này.

Biến tần phải là biến toàn cục, trong đó chuỗi N có quyền truy cập vào nó. Vậy tôi phải đặt nó ở đâu?

Tôi không biết liệu tôi có thể giải thích cho bản thân mình đúng không. Cố gắng hết sức.

Trả lời

6

Chỉ tuyên bố biến của bạn trong .h tập tin

extern pthread_mutex_t mutex1; 

và giữ nét với việc khởi tạo trong file C. Điều này là như nó có nghĩa là bởi các tiêu chuẩn C (s).

Đối với POSIX, việc khởi tạo mutex với lưu trữ tĩnh thực sự quan trọng. Vì vậy, định nghĩa không thể sống trong một tập tin .h.

1

Nếu bạn phải có biến toàn cầu và chia sẻ nó giữa các mô-đun trong 'C', tôi nghĩ rằng nó là điển hình để nó được khai báo trong tệp bao gồm. Trong những ngày cũ, chúng tôi sẽ sử dụng một số macro ma thuật như "GLOBAL" trong tệp .h dưới dạng "extern" và trong chính chúng tôi định nghĩa lại GLOBAL là không có gì để nó được khai báo chính.

#ifndef _TYPES_H 
#define _TYPES_H 

    // types.h 

    #ifndef GLOBAL 
    # define GLOBAL extern 
    #endif 

    GLOBAL my_global mutex; 


#endif 
+0

Ok Tôi hiểu ý của bạn là gì. Hãy để tôi xem nó hoạt động như thế nào. Cảm ơn vì lời khuyên! – Alessandroempire

+0

Tôi không nghĩ rằng trò chơi với 'GLOBAL' phục vụ nhiều, ở đây. Bạn cần một khai báo trong tệp '.h' và định nghĩa * với khởi tạo * trong' .c'. Việc khởi tạo mặc định cho 'pthread_mutex_t' sẽ không thực hiện. –

+0

@ JensGustedt thats chính xác những gì tôi vừa làm và nó hoạt động. Tôi không nhận thấy tôi đã khởi tạo mutex trong tệp .h. Sai lâm lơn. – Alessandroempire

2

Nhưng tôi khá chắc chắn tôi không thể xác định các mutex trong file son.c vì mỗi lần tôi có thể tạo chủ đề đó, mutex sẽ được khởi tạo để thiết lập mặc định của nó, không cho phép tôi sử dụng nó đúng cách . Không chắc chắn về điều này.

Điều này không đúng. Đặt định nghĩa mutex trong tệp đó, nhưng bên ngoài hàm chuỗi. Nó sẽ được khởi tạo khi khởi động chương trình, nhưng không được khởi chạy trên mỗi luồng mới. Bạn có thể đặt extern pthread_mutex_t mutex1; vào một trong các tệp tiêu đề sao cho bất kỳ người dùng nào của mutex không ở trong số son.c đều biết về mutex.

+0

Đó là nghi ngờ của tôi! Tôi nghĩ mỗi khi tôi tạo ra một chủ đề mới, nó sẽ chỉ cần thiết lập lại mutex Vâng thats tin tốt. Cảm ơn rất nhiều! – Alessandroempire

Các vấn đề liên quan