2010-12-22 46 views
10

Trong C++, khi bạn có các biến cục bộ trong một hàm thành viên tĩnh, có nghĩa là các biến cục bộ đó cũng ngầm tĩnh hay chúng thực sự cục bộ?Chức năng thành viên tĩnh và an toàn luồng

dụ:

static void myClass::somefunc(int someint) 
{ 

int myint = someint; // is myint really a local variable or does it change due to the static qualifier at function level? 


} 

Ngoài ra, chủ đề khác nhau từ một hồ bơi thread chạy chức năng này, không Myint cần phải được bảo vệ bởi một ổ khóa? giả định rằng tất cả các giá trị được truyền cho nó là khác nhau và không có mối quan hệ với nhau.

EDIT: Thanx cho câu trả lời. Bây giờ điều gì sẽ xảy ra nếu tôi chuyển qua một số boost::shared_ptr<T>, biết rằng đối tượng này sẽ không được đồng thời đang được sử dụng bởi một luồng khác? (Không chắc chắn liệu một người có thể thực sự đảm bảo rằng, hoặc có thể bạn?)

Tôi đoán một ptr nguyên qua, sẽ cần một số bảo vệ, nếu nó đã được sử dụng trên tất cả?

+1

Bạn đang bối rối bởi tĩnh có hai nghĩa hoàn toàn khác nhau. Bạn không đơn độc, đó có lẽ là lý do tại sao tĩnh trên một hàm độc lập không được dùng nữa. – Suma

Trả lời

8

Chúng là địa phương trừ khi bạn khai báo chúng static - mỗi lần giải thích hàm sẽ có bản sao biến riêng và bạn không cần phải bảo vệ chúng.

+6

@ T33C: Anh ta có một địa chỉ 'tĩnh 'ở đâu? – sharptooth

+1

Một số người có vẻ nhầm lẫn giữa 'hàm tĩnh' với' biến cục bộ tĩnh ', trong khi thực tế không có mối quan hệ nào giữa hai biến. –

+1

@ T33C: Bạn đã sai. Biến rõ ràng là không tĩnh (ngay cả khi chức năng là). Xóa -1 –

1

myint là địa phương cho somefunc và bạn không cần phải bảo vệ nó trên các chuỗi.

1

myint trong ví dụ của bạn là biến cục bộ, mỗi khi somefunc được gọi là myint life. nhưng không nhiều hơn thế.

Myint không cần phải được bảo vệ bởi vì một biến địa phương của nó

1

myint sẽ thực sự là địa phương. Bạn không phải lo lắng về việc bảo vệ nó. Một không gian riêng biệt sẽ được tạo trên ngăn xếp cho myint cho mọi cuộc gọi hàm trong bộ nhớ.

1

Biến số myint sẽ ở lại cục bộ, không cần phải bảo vệ chúng vì mỗi chuỗi sẽ không chia sẻ các biến cục bộ.

1

Từ khóa tĩnh nghĩa là chức năng sẽ không được chuyển qua đối số "này" ẩn. Ngoài ra, hàm sẽ không có quyền truy cập vào dữ liệu cá thể của lớp. Vòng loại tĩnh của hàm, không ảnh hưởng đến dữ liệu cục bộ của hàm.

Các static RetType SomeClass::SomeMethod(Type arg) có cùng một "kiểu" như một chức năng miễn phí RetType SomeFunc(Type arg)

Kính trọng,
Marcin

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