2009-12-30 40 views
9

Tôi đang phát triển một thư viện được chia sẻ (.so) và dll. Tôi có một biến toàn cầu được cập nhật trong nhiều chủ đề. Vì vậy, tôi có khóa mutex để đồng bộ hóa.Biến toàn cầu trong thư viện/dll được chia sẻ, được chia sẻ qua quá trình

Tôi không rõ liệu dữ liệu toàn cầu trong thư viện được chia sẻ có được chia sẻ trên toàn bộ quy trình hay không. Nếu đó là sau đó tôi cần phải sử dụng semaphores để đồng bộ hóa. Khi tôi hiểu các biến toàn cục là một phần của phân đoạn dữ liệu, vì vậy tôi muốn hiểu cách dll quản lý dữ liệu chung trên các quy trình. Mọi thông tin w.r.t. định dạng dll và phân đoạn sẽ hữu ích.

Cảm ơn.

+0

Câu hỏi liên quan với giải thích tốt về cách thức DLL thực sự hoạt động: http://stackoverflow.com/questions/12229396/unresolved-external-symbol-static-variable-variable-used-by-method -defined-in-h –

Trả lời

10

Theo mặc định, không, biến toàn cục không được chia sẻ giữa các quy trình.

Tuy nhiên, bạn có thể sử dụng phân đoạn dữ liệu (data_seg) để chia sẻ các biến toàn cầu trên các quy trình. Bạn có thể tìm thêm thông tin về MSDN trong bài viết có tiêu đề "How do I share data in my DLL with an application or with other DLLs?"

+0

@CasperOne: Theo mặc định, phân đoạn dữ liệu thư viện được chia sẻ được sao chép trên mỗi quy trình? – Andy

+0

@Andy: Tôi không biết ý bạn là gì khi được sao chép. Về cơ bản, bạn sẽ có thể chia sẻ các giá trị trên các quy trình nếu bạn liên kết đến cùng một dll, nếu đó là những gì bạn đang yêu cầu. Nếu không, bạn có thể xây dựng? – casperOne

+0

@CasperOne: Tôi nghĩ rằng đoạn mã (văn bản) của dll được chia sẻ trên toàn bộ quá trình. Vì vậy, tôi muốn biết điều gì xảy ra với phân đoạn dữ liệu của dll. Nội dung của phân đoạn dữ liệu từ dll có được sao chép vào phân đoạn dữ liệu quá trình hay không. Và điều này xảy ra như thế nào trong quá trình tải dll động. – Andy

0

Hoàn toàn KHÔNG. Mỗi quá trình có không gian bộ nhớ ảo riêng của nó và không thấy bộ nhớ của các quá trình khác. Hai quy trình thậm chí có thể lưu trữ giá trị khác nhau tại cùng một địa chỉ, nói 1000000 - bởi vì địa chỉ ảo của chúng "1000000" được ánh xạ tới các ô nhớ vật lý khác nhau (ví dụ: "2000000" cho quá trình đầu tiên và "3000000" cho giây thứ hai. Shared dll

+0

Xin lỗi, nhưng điều đó không đúng. – casperOne

+0

Hãy thử đọc một cái gì đó, ví dụ bắt đầu với điều này: http://msdn.microsoft.com/en-us/library/ms810627.aspx về quản lý bộ nhớ/ánh xạ bộ nhớ ảo và quản lý bộ nhớ trong các quy trình khác nhau tại nền tảng win32, trước khi viết Bất cứ điều gì ở đây :) – user224564

+0

Trớ trêu thay cách bạn nói "cố gắng đọc cái gì đó", khi trên thực tế tôi đăng một liên kết tới MSDN hiển thị chính xác những gì được thực hiện, cũng như tại sao câu trả lời của bạn sai. – casperOne

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