Tôi đang sử dụng C++ std::atomic_flag
làm cờ Boolean nguyên tử. Đặt cờ thành true hoặc false không phải là một vấn đề nhưng làm thế nào để truy vấn trạng thái hiện tại của cờ mà không cần đặt nó vào một giá trị nào đó? Tôi biết rằng có các phương pháp 'atomic_flag_clear
' và 'atomic_flag_set
'. Họ trả lại trạng thái trước đó nhưng cũng sửa đổi trạng thái hiện tại. Có cách nào để truy vấn trạng thái cờ mà không sửa đổi nó hay tôi phải sử dụng đầy đủ 'std::atomic<bool>
'.Trạng thái truy vấn C++ atomic_flag
Trả lời
Bạn không thể đọc giá trị std::atomic_flag
mà không đặt giá trị true
. Điều này là do thiết kế. Nó không phải là một biến boolean (chúng tôi có std::atomic<bool>
cho điều đó), nhưng một lá cờ tối thiểu được đảm bảo khóa miễn phí trên tất cả các kiến trúc có hỗ trợ C++ 11.
Trên một số nền tảng, chỉ các hướng dẫn nguyên tử duy nhất là hướng dẫn trao đổi. Trên các nền tảng như vậy, std::atomic_flag::test_and_set()
có thể được triển khai với exchange var,1
và clear()
với exchange var,0
, nhưng không có hướng dẫn nguyên tử nào để đọc giá trị.
Vì vậy, nếu bạn muốn đọc giá trị mà không thay đổi giá trị, thì bạn cần std::atomic<bool>
.
chỉ muốn trích dẫn cuốn sách của bạn .... – haohaolee
Điều gì sẽ xảy ra nếu tôi chỉ muốn in giá trị của nó cho mục đích gỡ lỗi, vì vậy tôi không thực sự quan tâm rằng * điều này * đọc cụ thể là nguyên tử? Bây giờ tôi sử dụng phần tử '.__ val' cho điều đó, nhưng nó đưa ra lỗi trong một số phiên bản của gcc (đúng như vậy tôi đoán) – user1273684
Bạn không thể đọc một cách hợp pháp giá trị của' std :: atomic_flag' cho bất kỳ mục đích nào mà không sửa đổi nó. Nếu bạn muốn đọc nó (ngay cả khi gỡ lỗi printf), bạn cần 'std :: atomic
Nếu bạn muốn sử dụng atomic_flag
để xác định xem một sợi nên thoát ra, bạn có thể làm điều đó như thế này:
khởi:
std::atomic_flag keep_running = ATOMIC_FLAG_INIT;
keep_running.test_and_set();
Chủ đề vòng lặp:
while (keep_running.test_and_set()) {
// do thread stuff
}
Khi bạn muốn chuỗi để thoát:
keep_running.clear();
- 1. Truy vấn quy trình Erlang cho trạng thái của nó?
- 2. Magento adminhtml Truy vấn AJAX trả về trạng thái 302
- 3. Truy vấn MySQL: Thời gian dài ở trạng thái 'init'
- 4. Trạng thái sao chép mysql bằng truy vấn chọn
- 5. C hoặc C++ Trạng thái trả lại
- 6. Trạng thái mức/trạng thái Pygame
- 7. Cập nhật Trạng thái Twitter trong C#
- 8. Trạng thái nào được lưu giữa các truy vấn tìm kiếm lại trong Linqpad?
- 9. C++ máy tạo trạng thái máy
- 10. Cách nhận trạng thái truy vấn đang chạy trong cơ sở dữ liệu postgresql
- 11. Cách truy vấn một thể hiện dòng công việc cho trạng thái thực thi của nó
- 12. Cập nhật hàng loạt sản phẩm đơn giản "trạng thái" qua truy vấn MySQL
- 13. Trạng thái phát hiện phát hiện vấn đề trong DataGridView
- 14. HTTPS có trạng thái hoặc trạng thái không?
- 15. Truy xuất mã trạng thái HTTPResponse/HTTPRequest iPhone SDK?
- 16. Cố gắng vô hiệu hóa Trạng thái không hoạt động của bộ xử lý (trạng thái C) trên Windows PC
- 17. Trạng thái pin trong OSX?
- 18. Thanh trạng thái UISplitViewController iOS7
- 19. PHP - trạng thái chuyển đổi
- 20. Nhận mã trạng thái HTTP bằng Selenium WebDriver C#
- 21. C++ Qt: Kiểm tra trạng thái hiện tại của QStateMachine
- 22. Khôi phục trạng thái OpenGL
- 23. Sử dụng SMO.Agent để truy xuất trạng thái thực hiện công việc SQL - vấn đề bảo mật
- 24. Làm cách nào để thêm trạng thái tệp git vào trạng thái của vim?
- 25. Mã sạch, đậu phiên không trạng thái và trạng thái riêng
- 26. Cách tìm trạng thái giao dịch
- 27. Truy vấn Mysql ở trạng thái 'SENDING DATA' trong thời gian dài khi sử dụng LEFT JOIN
- 28. Trạng thái PNG hoạt ảnh
- 29. Nhân bản trạng thái Lua
- 30. MPMoviePlayerViewController Ẩn thanh trạng thái
Nó sẽ xuất hiện rằng việc sử dụng duy nhất của nó là để có được một phương tiện để có được một khóa. Bạn có thể sử dụng 'std :: atomic_flag' làm khóa mà bạn có thể có được trước khi truy cập tài nguyên được chia sẻ, nhưng nếu tài nguyên được chia sẻ đó chỉ là' bool' thì bạn có thể sử dụng 'std :: atomic '. _Edit: _ hoặc đúng hơn là std :: atomic_bool, xem như thế nào họ đã đi đến những rắc rối của một chuyên cho bạn! –
Rook
Bạn không thể biết trạng thái hiện tại, trừ khi bạn sử dụng đúng ngữ nghĩa thu được/giải phóng (tức là cố gắng khóa nó bằng 'atomic_flag_set', và sau đó chỉ thực hiện công việc nếu bạn thực sự thay đổi giá trị). Đơn giản chỉ cần đọc nó sẽ chỉ cho bạn biết giá trị là gì khi bạn đọc nó, và nó có thể đã thay đổi ngay lập tức sau đó. –
@Mike: điều đó có thực sự quan trọng không? Âm thanh như tất cả các OP muốn là khả năng để thực hiện một đọc nguyên tử và có một số khái niệm về lần đọc và viết ra lệnh. – Rook