2012-01-07 36 views
13

Vì vậy, có list of c++11 features supported by visual studio.C++ 11 thread_local hỗ trợ từ khóa trong studio trực quan 11

hỗ trợ thread_local được đánh dấu là một phần. Tôi đã không thể tìm thấy một lời giải thích về những gì chính xác hỗ trợ một phần có nghĩa là ở đây. Họ chỉ bí danh __declspec (thread)?

Tôi chỉ có thể sử dụng tăng :: thread_specific_ptr, nhưng dường như có một số báo cáo rằng boost::thread_specific_ptr is slow. Điều đó có thể hoặc không thể là sự thật.

Cụ thể là tôi muốn có TLS nhanh trên x86/x64 trên linux + gcc và windows + msvc gần đây nhất. Nhanh chóng có nghĩa là không có cuộc gọi hệ thống nếu có thể (Tôi nghĩ rằng điều này là có thể cho các nền tảng ở trên.)

+5

Xem trước nhà phát triển Visual C++ 11 không hỗ trợ từ khóa 'thread_local'. –

+0

Sự hiểu biết của tôi là 'một phần' ở đây có nghĩa là ngữ nghĩa được hỗ trợ nhưng không thông qua cú pháp/từ khóa chuẩn. – ildjarn

+1

@ybungalobill Hoặc là GNU, POSIX, Microsoft, SUN, IBM và ủy ban C++ std đều cung cấp cơ sở vật chất cho những thứ không cần thiết trong phần mềm được thiết kế tốt hoặc hiểu biết của bạn là thiếu sót. Nhưng tôi muốn nghe ý kiến ​​của bạn. – Eloff

Trả lời

6

Vì vậy, tôi đã làm một số đào sâu vào ngữ nghĩa thread_local. gcc's __thread và msvc's __declspec (thread) có cùng ngữ nghĩa như nhau và thread_local (khởi tạo động sang một bên, có thể hoặc chưa có thể làm cho nó thành tiêu chuẩn.) Vì vậy, đây thực sự là một vấn đề cho trường hợp sử dụng của tôi. Tôi sẽ chỉ xác định rằng bí danh một hoặc thuộc tính nền tảng cụ thể khác.

+9

Đáng buồn thay, vấn đề với các cơ chế này là chúng không hỗ trợ các loại không thuộc POD. Khi một thread bị chấm dứt, tôi muốn các đối tượng TLS của nó có các destructors được gọi. Cả '__thread' hoặc' __declspec (thread) 'đều không thể xử lý điều đó. Nếu bạn không cần điều đó, cách tiếp cận này sẽ hoạt động tốt – jalf

+1

Bạn không nhận được xây dựng/phá hủy không tầm thường miễn phí, vì vậy nếu bạn cần có nhiều người biểu diễn hơn (không có nó không phải là một từ, nhưng nó phải là) cơ chế. Tôi đã đi với một bối cảnh __thread * và sau đó phân bổ bối cảnh trên ngăn xếp trong phương pháp bắt đầu thread và thiết lập bối cảnh tls * để trỏ đến nó. Sau đó, tôi nhận được xây dựng/phá hủy thích hợp và truy cập vào nó nên gần như là nhanh nhất có thể. – Eloff

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