2012-04-07 29 views
8

Tôi sử dụng <thread> <atomic> <mutex> v.v. trong mã của tôi, bao gồm một số thuật toán không có khóa. Tôi đang nhắm mục tiêu (cuối cùng) một môi trường Linux. Tôi đã phát triển với Visual Studio 2011 Beta, trong khi thiếu khủng khiếp trong các tính năng C++ 11 khác, dường như là chuỗi công cụ duy nhất thực hiện các tính năng đồng thời.Đồng thời C++ 11 - Công cụ nào có thể được sử dụng?

Xem C++ 11 hỗ trợ ở đây:

Bây giờ nếu những người khác chỉ đơn giản là thiếu một thư viện chứa C++ 11 tính năng đồng thời, tôi có thể dễ dàng sử dụng just::thread, tuy nhiên cả clang và gcc trả lời "không" cho mô hình bộ nhớ C++ 11, ít nhất là hình ảnh C++ dường như hỗ trợ. Tôi không chắc chắn chính xác tác dụng của điều này sẽ là gì - có lẽ là tối ưu hóa việc sử dụng mã miễn phí có hiệu lực phụ, trong số những thứ sai lầm khác.

Nếu bây giờ tôi hoàn toàn tránh các bản dựng được tối ưu hóa và biên dịch chỉ các bản dựng gỡ lỗi mà không bật tối ưu hóa - có hợp lý để sử dụng chuỗi công cụ Clang hoặc GCC không?

+4

Dự đoán trước mắt của tôi là nếu bạn sử dụng 'just :: thread', nó sẽ hoạt động tốt. Nó sử dụng nguyên gốc (Posix hoặc Win32) nguyên thủy để thực thi những thứ như đặt hàng, vì vậy tôi nghĩ rằng một trình biên dịch sẽ phải được khá nặng bị hỏng nói chung cho nó thất bại. –

+1

Bạn có lẽ nên bao gồm một thẻ có liên quan đa luồng trong danh sách của bạn, Anthony Williams thường xuyên hiển thị ở đây, vì vậy nếu bạn đủ may mắn, anh ta sẽ nhận thấy sau đó. Tôi nghĩ rằng ông đã tạo ra 'chỉ :: thread' để nó sẽ là nền tảng chéo, vì vậy tôi sẽ không mong đợi bất kỳ vấn đề nào. –

Trả lời

1

Tôi đã sử dụng gcc-4.7 trên Linux 64 bit và cửa sổ thành công. std::thread vv hoạt động hoàn hảo trên linux ngay cả với gcc-4.6.
Trên các cửa sổ gcc-4.7 (mingw64) có một số vấn đề nhỏ, rò rỉ bộ nhớ với các bộ hủy của std::condition_variable AFAIR.

4

GCC 4.7 status

C++ mô hình bộ nhớ làm việc đang diễn ra và dự kiến ​​hoàn thành trong tiếp theo GCC phát hành. GCC 4.7 hiện đã được phát hành, vì vậy đây là những gì bạn có thể mong đợi từ nó.

  • Thực hiện nguyên tử đầy đủ để được hướng dẫn miễn phí khóa được hỗ trợ. Tất cả các hoạt động nguyên tử đã được triển khai với các nội trang __atomic mới và hầu hết các mục tiêu phản ánh tham số mô hình bộ nhớ trong mã được tạo. Tối ưu hóa sẽ không di chuyển bộ nhớ chia sẻ hoạt động trong quá khứ hoạt động nguyên tử, do đó, các mối quan hệ khác nhau xảy ra được tôn trọng.
  • Khi không có hướng dẫn khóa miễn phí (thông qua hỗ trợ phần cứng hoặc hệ điều hành), các cuộc gọi hàm sẽ được thư viện giải quyết. Do các ràng buộc về thời gian và một API mà không được hoàn thành, không có libatomic được cung cấp với GCC 4.7. Đây là dễ dàng xác định bằng cách gặp phải các biểu tượng bên ngoài không hài lòng bắt đầu bằng _ nguyên tử *.
  • Nếu chương trình yêu cầu hỗ trợ thư viện, việc triển khai mẫu tệp C duy nhất sẽ được biên dịch và liên kết với chương trình khách hàng để giải quyết các cuộc gọi chức năng bên ngoài này bằng cách thực hiện bị khóa. Tải xuống mẫu libatomic
  • Mẫu C++ hoàn toàn hỗ trợ các đối tượng có kích thước tùy ý, mặc dù tệp libatomic.c đã đề cập trước đó có thể được yêu cầu để đáp ứng một số lớp học do người dùng định nghĩa . Nếu một lớp bản đồ có cùng kích thước với loại tích hợp không cần khóa , thì các thói quen không khóa cũng sẽ được sử dụng.
  • Bitfields không tương thích với mô hình bộ nhớ. Đó là để nói rằng họ có thể giới thiệu tải hoặc lưu trữ dữ liệu chủng tộc do toàn bộ từ truy cập khi đọc hoặc viết.
  • Tối ưu hóa chưa được kiểm toán đầy đủ để tuân thủ, mặc dù một số công việc đã được thực hiện. Một số tối ưu hóa có thể giới thiệu dữ liệu mới các chủng tộc không có trước đây. Số lượng các trường hợp đã biết là nhỏ và việc kiểm tra tính tuân thủ không phải là nhỏ. Nếu bất kỳ ai gặp trường hợp tối ưu hóa giới thiệu một cuộc đua dữ liệu mới, vui lòng mở một trường hợp lỗi để nó có thể được giải quyết.

Hỗ trợ LLVM dường như được tiếp tục cùng: http://llvm.org/releases/3.0/docs/Atomics.html

Thật khó để nói đến mức độ này là thực sự được sử dụng trong vang mặc dù. Có vẻ như <atomic> về cơ bản hoạt động đối với một số loại. Tôi nhận được xác nhận trình biên dịch cho các loại khác nói rằng loại nguyên tử là bất ngờ, mang lại một chút tự tin cho các loại nó hoạt động với.

+0

Điều này có vẻ đầy hứa hẹn. Tôi đang thực sự nghiêng về phía clang bởi vì nó dường như sản xuất các thông báo lỗi hữu ích hơn - và đó là một đồng bộ thời gian đáng kể cho tôi với C++. Có một QtCreator thử nghiệm sử dụng clang để thực hiện mô hình mã (hoàn thành, tô sáng, tái cấu trúc, v.v.) Tôi sẽ thử, vì tôi thực sự nhớ studio trực quan của tôi + hỗ trợ trực quan x trên linux. – Eloff