Trong một ứng dụng đa luồng, có cách nào để đảm bảo rằng một phần quan trọng được khởi tạo chỉ một lần ngoại trừ việc đặt mã trong DLL main() ??Khởi tạo phần quan trọng chỉ một lần cho một quá trình
Trả lời
Tôi muốn đề xuất gói CRITICAL_SECTION với một lớp sẽ xử lý việc khởi tạo và uninitialization đối tượng phần quan trọng trong hàm tạo và hàm hủy của nó. Bằng cách này, bạn sẽ là chủ đề an toàn trong hầu hết các trường hợp (bạn sẽ phải đảm bảo không có ai truy cập đối tượng trước khi hàm tạo của nó hoàn thành, nhưng điều đó tương đối dễ dàng).
Có một số trình bao bọc phổ biến cho CRITICAL_SECTION bạn có thể sử dụng. MFC của CCriticalSection là choise rõ ràng, nhưng bạn có thể tạo của riêng bạn là tốt.
Chắc chắn có nhiều cách.
- Sử dụng một biến toàn cầu
- Sử dụng một ví dụ singleton
- Tạo nó trong chính hoặc một số chức năng trường hợp duy nhất khác
- Tạo nó như là một var thành viên của một số cá thể của lớp trường hợp duy nhất
và cứ tiếp tục như vậy. Điều này không khác với bất kỳ câu hỏi nào khác về việc cố gắng tạo một cá thể đơn lẻ của một số thứ trong mã của bạn.
Bạn cũng có thể sử dụng lớp trình bao bọc và khai báo đối tượng chung của lớp đó. Hàm khởi tạo của đối tượng chung sẽ được gọi chỉ một lần khi khởi động.
Trên Windows Vista, bạn có thể sử dụng chức năng khởi tạo một lần. Using One-Time Initialization cho biết cách sử dụng chúng để đảm bảo sự kiện chỉ được khởi tạo một lần.
Bạn có thể khởi tạo phần quan trọng toàn cầu trong DllMain
cho DLL_PROCESS_ATTACH
(và dọn dẹp cho DLL_PROCESS_DETACH
).
- 1. Tại sao bạn đặt tên cho lớp hai lần trong quá trình khởi tạo trong Java?
- 2. Khởi tạo một lớp bằng trình khởi tạo siêu lớp
- 3. Thực hiện một phần quan trọng trong CUDA
- 4. Các bộ so sánh có nên được khởi tạo mỗi lần hoặc chỉ một lần?
- 5. Chỉ sản lượng một lần cho mỗi lần lặp
- 6. Làm thế nào để khởi tạo một biến địa phương trong Java chỉ một lần
- 7. Có phải lập trình Agile quá ... ad hoc cho các hệ thống an toàn quan trọng?
- 8. Gọi trình khởi tạo tĩnh lần nữa
- 9. Làm cách nào để tạo một phần quan trọng với Boost?
- 10. OpenMP - tạo chủ đề chỉ một lần
- 11. Các phần quan trọng trong chủ đề
- 12. Quy trình con Nodejs: ghi vào stdin từ một quá trình đã được khởi tạo
- 13. một document.createElement, thêm nó hai lần, chỉ cho thấy một lần
- 14. Tạo ra một quá trình nền trong Ruby
- 15. Chi phí của mutex, phần quan trọng vv trên Windows
- 16. Buộc khởi tạo một HwndHost
- 17. Tạo một lớp Python cho "chỉ một ví dụ"?
- 18. Khi nào một lớp học sẽ có nhiều hơn một trình khởi tạo được chỉ định?
- 19. Đăng nhập một lần trên Facebook của Android - nhiều băm quan trọng có thể?
- 20. Đảm bảo NHibernate SessionFactory chỉ được tạo một lần
- 21. C++ Tương đương với Trình khởi tạo được Chỉ định?
- 22. Giết một quá trình và chờ quá trình thoát
- 23. Tại sao hàm tạo chỉ được gọi một lần?
- 24. setTimeout chỉ chạy một lần?
- 25. Trong C, là khởi tạo mảng chỉ với một phần tử được xử lý đặc biệt?
- 26. Android ProgressBar.setProgressDrawable chỉ hoạt động một lần?
- 27. Cách khởi chạy hoạt động chỉ một lần khi ứng dụng được mở lần đầu tiên?
- 28. .NET - cách tạo một lớp sao cho chỉ có một lớp cụ thể khác có thể khởi tạo nó?
- 29. Có một hàm khởi tạo tĩnh hoặc trình khởi tạo tĩnh trong Python không?
- 30. Java se "xảy ra trong quá trình khởi tạo VM"
Đây chắc chắn là một cách tiếp cận tốt; dựa vào các biến toàn cầu hoặc các singletons không hoạt động tốt nếu phần quan trọng cần được sử dụng trước khi tất cả các nhà xây dựng đối tượng toàn cục được đảm bảo được gọi. – reuben