5

Tôi có bit sau của C + + 11 mã có sử dụng các chủ đề và biến initialisations tĩnh. Câu hỏi của tôi là:C++ tĩnh inialization và chủ đề

Bảo đảm hoặc đảm bảo ngôn ngữ C++ thực hiện việc khởi tạo biến tĩnh đơn lẻ - mã bên dưới hiển thị các giá trị chính xác, tuy nhiên dường như tôi không tìm thấy đoạn văn trong tiêu chuẩn mới đề cập đến cách thức mô hình bộ nhớ nên tương tác với chủ đề. Khi nào các biến trở thành thread-local?

#include <iostream> 
#include <thread> 

class theclass 
{ 
public: 
    theclass(const int& n) 
    :n_(n) 
    { printf("aclass(const int& n){}\n"); } 
    int n() const { return n_; } 
private: 
    int n_; 
}; 

int operator+(const theclass& c, int n) 
{ 
    return c.n() + n; 
} 

void foo() 
{ 
    static theclass x = 1; 
    static theclass y = x + 1; 
    printf("%d %d\n",x.n(),y.n()); 
} 

int main() 
{ 
    std::thread t1(&foo); 
    std::thread t2(&foo); 
    t1.join(); 
    t2.join(); 
    return 0; 
} 

Trả lời

8

Mã sẽ làm những gì bạn mong đợi. Xem §6.7.4

biến cục bộ tĩnh là:

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

Nói cách khác trình biên dịch đảm bảo các chủ đề của bạn hợp tác trên khởi tạo của người dân địa phương tĩnh. Chúng sẽ được khởi tạo một lần và mỗi luồng sẽ chỉ có quyền truy cập đối tượng sau khi nó được khởi tạo hoàn toàn.

Trình biên dịch sẽ chỉ tạo một biến cục bộ luồng khi được yêu cầu một cách rõ ràng với từ khóa thread_local.