Chúng có cùng biến hay không? Nói cách khác, linkage của họ là gì?
Nếu nó ở bên ngoài, thì không. Nếu nó là nội bộ, sau đó nó là OK trừ khi hai định nghĩa cả hai xảy ra trong cùng một tệp.
Nếu không có liên kết, thì không có vấn đề gì.
Trừ khi tôi bỏ qua điều gì đó, thread_local
không ảnh hưởng đến liên kết, vì vậy quy tắc thông thường sẽ áp dụng (và xác định biến thread_local
trong một đơn vị dịch và không vi phạm quy tắc một định nghĩa).
Tôi nghĩ rằng có một lỗi trong tiêu chuẩn ở đây, tuy nhiên. Các tiêu chuẩn (§7.1.1/1) nói rằng "Nếu thread_local xuất hiện trong bất kỳ tuyên bố nào của một biến, nó sẽ có mặt trong tất cả các khai báo của thực thể đó." Không có tuyên bố rõ ràng rằng không cần chẩn đoán hoặc vi phạm quy tắc này là hành vi không xác định, vì vậy trình biên dịch là yêu cầu để chẩn đoán lỗi. Ngoại trừ việc, tất nhiên, nếu bạn định nghĩa ở phạm vi namespace:
thread_local int i;
trong một đơn vị dịch thuật và:
int i;
trong khác, sau đó trình biên dịch có lẽ không thể chẩn đoán lỗi (và tôi khá chắc chắn ủy ban không muốn yêu cầu nó). Tôi đoán là ý định ở đây là hành vi không xác định.
Nguồn
2013-01-23 18:27:36
Có mã ví dụ về cách một 'envptr' sẽ được trang trí bằng' __thread' (?), Nhưng khác thì không? Cách duy nhất tôi có thể tưởng tượng đây là không phải là externs trong hai tập tin khác nhau ..và nếu có, thì có vẻ như nó có thể là câu trả lời đơn giản trong ngữ cảnh đó. –
@pst có, đó là cách thực hiện. chúng được khai báo trong các tệp cpp và một hàm 'Env * getEnv();' được cung cấp trong một tiêu đề. Mỗi tệp '.cpp' định nghĩa nó khác nhau. Các chủ đề sử dụng phiên bản TLS chạy trên mã từ một tệp '.so' được nạp vào cùng một tiến trình như luồng chính sử dụng biến không TLS (là trình biên dịch LLVM JIT được sử dụng bởi một trình bao REPl). –
Tôi đã bỏ phiếu để đóng vì tôi nghĩ rằng nó có một giải pháp thực sự đơn giản: Tôi sẽ chỉ sử dụng một tên khác cho tệp .cpp được liên kết với tệp DLL và tệp .cpp được liên kết với tệp thực thi chính. EDIT: Điều này sẽ hạn chế khả năng áp dụng của các tập tin .so, vì vậy tôi vẫn muốn thử các cách tiếp cận khác. –