2010-01-01 30 views
10

Tôi biết rằng như của chuẩn C++ 03, hàm phạm vi khởi tạo tĩnh không đảm bảo được thread an toàn:C++ 0x khởi tạo tĩnh và an toàn thread

void moo() 
{ 
    static std::string cat("argent"); // not thread safe 
    ... 
} 

Với C++ 0x tiêu chuẩn cuối cùng cung cấp hỗ trợ thread tiêu chuẩn, là khởi tạo tĩnh chức năng phạm vi yêu cầu để được thread an toàn?

+3

Tôi nghĩ đến ngày hôm nay nó sẽ được gọi là C++ 1x –

+0

Bjarne Stoustrup nói rằng x là một số thập lục phân, vì vậy vẫn 0x –

+0

@John: Bất kể những gì anh ta có thể suy nghĩ hoặc thích, sự hiểu biết của tôi là Các hướng dẫn ISO yêu cầu phiên bản của các tài liệu như các tiêu chuẩn phải nằm trong cơ sở-10. –

Trả lời

9

có vẻ như việc khởi tạo sẽ được chủ đề an toàn, vì trong trường hợp đối tượng là tự động khởi tạo khi vào chức năng, nó đảm bảo được thực hiện trong một bộ phận quan trọng:

§ 6.7 stmt.decl

4.. ..such một đối tượng được khởi tạo kiểm soát thời gian đầu tiên đi qua khai báo của nó ... Nếu kiểm soát nhập đồng thời trong khi đối tượng đang được khởi tạo, thực thi đồng thời sẽ chờ hoàn thành việc khởi tạo ...

có một trường hợp tiềm năng, nếu sau khi trở về từ main(), hàm hủy của đối tượng tĩnh gọi hàm sau khi địa phương tĩnh đã bị hủy, hành vi là không xác định. tuy nhiên, điều đó phải dễ tránh.

+3

Từ cuối cùng nổi tiếng "nên dễ tránh". Nó rất khó tránh trong trường hợp chung. –

+0

@deft_code: +1, gần đây đã bị cắn bởi điều đó. – peterchen

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