2017-07-18 25 views
14

Tôi đang tìm kiếm để chuyển đổi các loại nguyên đến chuỗi sử dụng std::to_string, nhưng tôi thấy đoạn này:Is std :: to_string thread safe?

std::to_string dựa vào std::locale cho các mục đích định dạng, và cuộc gọi do đó đồng thời để std::to_string từ nhiều chủ đề có thể kết quả trong serialization phần các cuộc gọi.

Nhưng tôi không thể tìm thấy bất cứ điều gì khác về chủ đề này, Google đã không đưa ra bất cứ điều gì, cũng như MSDN. Tôi đang sử dụng Visual Studio 2013 nếu nó quan trọng.

Chủ đề này có an toàn không? Nếu vậy, làm thế nào?

+8

Không có gì về báo giá nói rằng nó không phải là chủ đề an toàn. Nó chỉ là nhiều cuộc gọi có thể không chạy đồng thời. Đó là vấn đề về hiệu suất chứ không phải vấn đề an toàn. – NathanOliver

+1

@Nathan Bắt đầu câu hỏi là std :: locale thread safe? –

+1

@NeilButterworth Các bộ phận của nó không. Ví dụ 'setlocale' không phải là luồng an toàn nên' std :: to_string' có thể sử dụng một mutex để đảm bảo nhiều cuộc gọi không chạy đua nếu nó gọi đó. – NathanOliver

Trả lời

7

std::to_string cư xử như thể nó gọi sprintf ([string.conversions]/7), và hành vi của sprintf phụ thuộc vào miền địa phương toàn cầu, có thể được sửa đổi bởi setlocale (hoặc bằng cách std::locale::global, mà trong nội bộ gọi setlocale).

Các từ ngữ trong [clocale.syn]/2 dường như ngụ ý rằng std::to_string là chủ đề an toàn, bởi vì nó không cho phép setlocale để giới thiệu một cuộc chạy đua dữ liệu với std::to_string hoặc sprintf.

+0

Cảm ơn bạn đã trả lời chi tiết – roybj

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