Tôi có một vấn đề hiểu tại sao shared_ptr đang sử dụng hướng dẫn cpu nguyên tử ... Tôi không thể tìm ra lý do vì nó không phải là chủ đề an toàn. Ai đó có thể giải thích. Nếu bạn tự hỏi làm thế nào tôi biết rằng nó sử dụng intstuructions nguyên tử: có một clip từ C + + và xa hơn nơi Herb và Andrei nói về nó, nhưng họ không bao giờ đề cập đến lý do tại sao nó như thế.lý do tại sao là std :: shared_ptr sử dụng các hoạt động cpu nguyên tử
Trả lời
Bất kỳ phiên bản nào của shared_ptr
đều là an toàn đa luồng. Dữ liệu mà nó trỏ đến không phải là an toàn đa luồng. Xem this.
Hướng dẫn nguyên tử, nếu được áp dụng đúng cách (bảo vệ được thực hiện theo cùng thứ tự bằng cách truy cập chuỗi cạnh tranh) là một cách để thực hiện an toàn luồng. Một cách khác là sử dụng mutexes.
Xem một câu hỏi tương tự cho BOOST: Is boost shared_ptr xxx thread safe?
Herb Sutter chỉ được sử dụng shared_ptr như một ví dụ ngơi thoải mái tại gotw ông 95, ông đi đó để xây dựng trên quyết định thiết kế:
https://herbsutter.com/2014/01/13/gotw-95-solution-thread-safety-and-synchronization/
Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. (Và tôi quá lười để thực hiện công việc) – johnchen902
- 1. lý do tại sao() không hoạt động?
- 2. hoạt động nguyên tử cho shared_ptr trong C++ 11
- 3. C++ 11 nguyên tử: tại sao mã này hoạt động?
- 4. lý do tại sao sử dụng nhiều luồng để có được tổng là chính xác?
- 5. Cách sử dụng std :: shared_ptr
- 6. Lý do tại sao việc sử dụng CPU không đạt 100% với C# và APM là gì?
- 7. Sử dụng Boost Python & std :: shared_ptr
- 8. lý do tại sao trình biên dịch là trì hoãn std :: danh sách deallocation?
- 9. Bất kỳ lý do nào để sử dụng các số nguyên 32 bit cho các hoạt động chung trên CPU 64 bit?
- 10. std :: shared_ptr không hoạt động với phạm vi cho
- 11. Cách hiểu lý do tại sao khối xử lý ruby ở 100% CPU
- 12. JPA lý do tại sao sử dụng createNamedQuery
- 13. Làm thế nào để xử lý phát triển C++ std :: namespace? ví dụ: std :: tr1 :: shared_ptr so với std :: shared_ptr so với boost :: shared_ptr vs. boost :: tr1 :: shared_ptr
- 14. Liệu std :: nguyên tử <std::string> có hoạt động phù hợp không?
- 15. Là một hoạt động nguyên tử đủ
- 16. Hoạt động nguyên tử trong ARM
- 17. C++ 0x std :: shared_ptr vs. boost :: shared_ptr
- 18. cách tăng :: shared_ptr hoạt động?
- 19. Lý do tại sao Hibernate's sessionFactory là thread an toàn
- 20. chi phí hoạt động nguyên tử
- 21. Có lý do nào không sử dụng std :: make_shared khi xây dựng các đối tượng không?
- 22. Sử dụng nguyên tử với std :: thread in C++ 11
- 23. Tại sao std :: for_each hoạt động chuỗi không sửa đổi?
- 24. Sử dụng luabind và std :: shared_ptr với thừa kế
- 25. lý do tại sao memcached?
- 26. File.Move hoạt động nguyên tử
- 27. Tại sao không sử dụng GPU làm CPU?
- 28. lý do tại sao không thể giải quyết GCC khai sử dụng này để đúng loại
- 29. Bài tập tham chiếu là nguyên tử vậy tại sao sử dụng AtomicReference
- 30. Sử dụng deleter tùy chỉnh với std :: shared_ptr
Để cụ thể hơn: số lượng tham chiếu được chia sẻ bên trong 'shared_ptr' có thể được truy cập bởi nhiều luồng. Đó là lý do tại sao nó cần thiết để tăng/giảm nó một cách nguyên tử. –