Chúng ta cần nhiều chương trình để gọi các hàm trong một thư viện chung. Chức năng thư viện truy cập và cập nhật bộ nhớ chung chung. Mỗi cuộc gọi hàm của chương trình cần xem bộ nhớ chung chung này. Đó là một cuộc gọi hàm cần xem các cập nhật của bất kỳ cuộc gọi hàm nào trước đó ngay cả khi được gọi từ một chương trình khác. Đối với lý do tương thích chúng tôi có một vài hạn chế thiết kế về cách các chức năng tiếp xúc của các thư viện chia sẻ phải hoạt động:Các đối tượng instantiating trong bộ nhớ chia sẻ C++
- Bất cứ mục dữ liệu (cả hai loại dữ liệu tiêu chuẩn và đối tượng) được công bố trên toàn cầu phải được hiển thị cho tất cả người gọi không phân biệt chuỗi trong đó mã đang chạy.
- Bất kỳ mục dữ liệu nào được khai báo cục bộ trong một hàm chỉ hiển thị bên trong hàm đó.
- Bất kỳ loại dữ liệu chuẩn nào hoặc thể hiện của bất kỳ lớp nào đều có thể xuất hiện cục bộ hoặc toàn cầu hoặc cả hai.
Một giải pháp là đặt bộ nhớ chung chung của thư viện vào bộ nhớ dùng chung. Cuộc gọi thư viện đầu tiên sẽ tạo bộ nhớ được chia sẻ có tên và khởi tạo nó. Các cuộc gọi chương trình tiếp theo sẽ lấy địa chỉ của bộ nhớ dùng chung và sử dụng nó làm con trỏ tới cấu trúc dữ liệu chung. Các cá thể đối tượng được khai báo trên toàn cầu sẽ cần được cấp phát động trong bộ nhớ chia sẻ trong khi các cá thể đối tượng được khai báo cục bộ có thể được đặt trên ngăn xếp hoặc trong vùng cục bộ của chuỗi người gọi. Các vấn đề phát sinh do các đối tượng khởi tạo trong bộ nhớ toàn cục có thể tạo và trỏ tới các đối tượng con phân bổ bộ nhớ bổ sung (mới). Các phân bổ mới này cũng cần phải nằm trong bộ nhớ dùng chung và được tất cả người gọi thư viện nhìn thấy. Một biến chứng khác là các đối tượng này, có chứa các chuỗi, các tệp, vv, cũng có thể được sử dụng trong chương trình gọi điện. Khi được khai báo trong chương trình gọi, bộ nhớ của đối tượng là cục bộ cho chương trình gọi điện, không được chia sẻ. Vì vậy, mã của đối tượng cần xử lý cả hai trường hợp. Dường như với chúng tôi rằng giải pháp sẽ yêu cầu chúng tôi ghi đè vị trí toàn cầu mới, các toán tử mới và xóa thông thường. Chúng tôi đã tìm thấy một thiết kế cho một hệ thống quản lý bộ nhớ có vẻ như nó sẽ hoạt động nhưng chúng tôi chưa tìm thấy bất kỳ triển khai thực tế nào. Nếu có ai biết về việc triển khai thiết kế quản lý bộ nhớ của Nathan Myers (http://www.cantrip.org/wave12.html?seenIEPage=1), tôi sẽ đánh giá cao một liên kết đến nó. Ngoài ra, nếu có ai biết về một trình quản lý bộ nhớ dùng chung khác có khả năng phân bổ động các đối tượng tôi cũng muốn biết về nó. Tôi đã kiểm tra các thư viện Boost và tất cả các nguồn khác mà tôi có thể tìm thấy nhưng không có gì dường như làm những gì chúng ta cần. Chúng tôi không muốn phải viết một bản thân. Kể từ khi hiệu suất và độ mạnh là quan trọng, nó sẽ được tốt đẹp để sử dụng mã đã được chứng minh. Cảm ơn trước vì bất kỳ ý tưởng/trợ giúp nào.
Cảm ơn các đề xuất về thư viện ATL và OSSP. Tôi đang kiểm tra chúng ngay bây giờ mặc dù tôi sợ ATL là quá Wincentric nếu là mục tiêu hóa ra là Unix.
Một điều khác hiện có vẻ rõ ràng đối với chúng tôi. Vì các đối tượng có thể được tạo động trong khi thực thi, lược đồ quản lý bộ nhớ phải có khả năng phân bổ các trang bổ sung của bộ nhớ dùng chung. Điều này bây giờ bắt đầu trông giống như một người quản lý bộ nhớ thay thế heap đầy đủ.
Không phải là giải pháp kinh điển cho vấn đề này để tạo ra một máy chủ, ứng dụng khách nào có thể sử dụng? Dễ dàng hơn nhiều so với futzing với bộ nhớ chia sẻ, mà không có khả năng làm việc vì những lý do bạn đưa ra. –
Đồng ý với Neil. – wheaties
Có. Việc thiết kế lại ứng dụng sẽ là cách dễ nhất để giải quyết vấn đề. Thật không may vì các ràng buộc thiết kế do compatilibty với các thành phần khác, chúng tôi không có tùy chọn đó. – BillC