2011-08-12 26 views
14

Tôi đọc rằng có một từ khóa mới trong C++: đó là __thread từ những gì tôi đã đọc.Sử dụng __thread bằng C++ 0x

Tất cả những gì tôi biết là đó là từ khóa được sử dụng như từ khóa static nhưng tôi không biết gì khác. Liệu từ khóa này chỉ có nghĩa là, ví dụ: nếu một biến được khai báo như vậy:

__thread int foo; 

thì mọi thứ cần làm với biến đó sẽ được thực hiện với một chuỗi mới?

+0

Bạn đã đọc nội dung đó ở đâu? –

Trả lời

21

Đó là thread_local, không phải __thread. Nó được sử dụng để xác định các biến có thời lượng lưu trữ của luồng.

thread_localmới thông số thời lượng lưu trữ được thêm vào C++ 0x. Có thời lượng lưu trữ khác: tĩnh, tự độngđộng.

Từ this link:

chủ đề địa phương thời gian lưu trữ (C++ 11 tính năng). Biến được cấp phát khi chuỗi bắt đầu và được deallocated khi thread kết thúc. Mỗi luồng có ví dụ riêng của biến. Chỉ các biến được khai báo thread_local có thời lượng lưu trữ này.


Tôi nghĩ rằng sự ra đời của từ khóa này có thể được thực hiện bằng cách giới thiệu một mô hình bộ nhớ tiêu chuẩn trong C++ 0x:

+0

whoa, câu trả lời trông hoàn toàn khác so với cách đây 3 phút. –

+0

@Mooing: Hiện tại. – Nawaz

+0

"' thread_local' là một thông số thời gian lưu trữ mới được thêm vào trong C++ 03 ": Điều gì là vô nghĩa này ?! –

5

Từ khóa được gọi là thread_local. Nó có nghĩa là mỗi luồng có phiên bản riêng của biến đó.

2

Không, nó không có nghĩa là "bất cứ điều gì để làm với biến đó sẽ được thực hiện với một chuỗi mới". Nó có nghĩa là sẽ có một bản sao của biến cho mỗi luồng tồn tại và mỗi luồng chỉ có thể thấy bản sao của biến đó.

+1

Không có từ khóa nào được gọi là '__thread' trong C++ 0x/11. –

19

Từ the Wikipedia article on "Thread-local storage":

Chủ đề cục bộ lưu trữ (TLS) là một phương pháp lập trình máy tính có sử dụng bộ nhớ tĩnh hoặc toàn cầu địa phương to a thread.

Điều này đôi khi cần thiết vì thông thường tất cả các luồng trong một quá trình chia sẻ cùng một không gian địa chỉ, đôi khi không mong muốn.

Và:

C++ 0x giới thiệu từ khóa thread_local.Bên cạnh đó, C++ triển khai biên dịch khác nhau cung cấp cách thức cụ thể để khai báo thread-địa phương biến:

Sun Studio C/C++, IBM XL C/C++, GNU C và Intel C/C++ (các hệ thống Linux) sử dụng cú pháp:

__thread int number; 

Visual C++, Intel C/C++ (các hệ thống Windows), Borland C++ Builder và Digital Mars C++ sử dụng cú pháp:

__declspec(thread) int number; 

Borland C++ Builder cũng hỗ trợ cú pháp:

int __thread number; 

Vì vậy, trong khi __threadkhông tồn tại trong thực tế và trên một số hệ thống, thread_local là mới, chính thức, từ khóa C++ 0x mà làm điều tương tự.

Ưu tiên không theo tiêu chuẩn __thread bất cứ khi nào bạn có quyền truy cập C++ 0x.

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