2010-03-03 42 views
12

Hôm nay, chúng ta gặp phải một vấn đề liên quan đến các hàm thành viên tĩnh trong môi trường đa luồng. Câu hỏi chúng tôi tự hỏi và không thể tìm thấy câu trả lời thỏa mãn là: là varialbes cục bộ của các hàm thành viên tĩnh cũng tĩnh?biến cục bộ của các hàm thành viên tĩnh

// header 

class A 
{ 
    static int test(); 
} 

// implementation 
int A::test() 
{ 
    int a = rand(); 
    int b = rand(); 
    int c = a + b; 

    return c; 
} 

Giả sử bạn có hai chủ đề vừa gọi A :: test(). Có thể là trong khi thread 1 xử lý c = a + b thread 2 vào kiểm tra() và thay đổi giá trị a bằng cách gán giá trị trả về mới của rand() hoặc nói cách khác, cả hai luồng đều vận hành một số vị trí bộ nhớ cho a, b và c ?

Trả lời

16

Không. Khung ngăn xếp độc lập với lời gọi hàm của từng chuỗi và mỗi người đều có người dân địa phương riêng. (Bạn cần phải cẩn thận nếu bạn đang truy cập dữ liệu được chia sẻ thực tế, ví dụ: các thành viên tĩnh trong lớp.)

1

Lớp lưu trữ của a, b và c là (tự động ẩn) thường có nghĩa là trên ngăn xếp cuộc gọi. Họ không "kế thừa" lớp lưu trữ tĩnh từ chữ ký phương thức (đó là một ý nghĩa khác của static (yay đối với các từ khóa quá tải!)).

2

Trừ khi được khai báo rõ ràng là tĩnh, không phải chúng không. Họ đang ở trên một ngăn xếp, và mỗi chủ đề có một ngăn xếp riêng biệt.

0

Không, a, b và c không tĩnh.

Đây là mẫu minh họa điều này:

class Val 
{ 
public: 
    Val() { cout << "Val" << this << endl; } 
    ~Val() { cout << "~Val" << this << endl; } 
    int n_; 
}; 

class A 
{ 
public: 
    static int test() 
    { 
     Val a; 
     a.n_ = rand(); 
     Val b; 
     b.n_ = rand(); 
     Val c; 
     c.n_ = a.n_ + b.n_; 
     return c.n_; 
    } 
}; 

int main() 
{ 
    srand(time(0)); 
    for(int i = 0; i < 5; ++i) 
    { 
     cout << "Test = " << A::test() << endl; 
    } 

    return 0; 

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