2011-10-11 39 views
24

Tôi đã thấy một số thời gian trước đây mọi người thảo luận về đa luồng mới trong Delphi XE và về thực tế là Delphi có một số vấn đề 'bản xứ' vì cách nó thực hiện đa luồng. Và họ đã đề xuất một số thư viện bên ngoài để thay thế đa luồng Delphi mặc định.Có gì mới trong đa luồng trong Delphi XE?

Bạn có thể chỉ cho tôi một số tài liệu và thư viện đa luồng phổ biến nhất cho Delphi XE không? Cảm ơn

+0

Tôi nhớ một trong những tính năng mới: dưới Delphi XE bạn có thể đặt tên cho một chủ đề. Mát mẻ. Co nhung nguoi khac? – Ampere

+6

'TThread.NameThreadForDebugging' tồn tại trong D2010. Tôi không tin rằng có bất kỳ vấn đề nghiêm trọng với mã luồng mà tàu với Delphi. Các thư viện phổ biến nhất và luồng tốt nhất là [OmniThreadLibrary] (http://otl.17slon.com/) nhưng @gabr là quá khiêm tốn để nói như vậy. –

+1

Delphi không có "vấn đề bản địa" với cách nó thực hiện luồng. Tôi đã sử dụng các lớp học dựa trên TThread từ năm 2003 mà không có bất kỳ phức tạp thực sự. Tuy nhiên, bạn không muốn bắt đầu với một khuôn khổ luồng bên thứ ba hiện có để tiết kiệm cho mình những rắc rối. – Misha

Trả lời

7

Tôi tin rằng tất cả các tính năng mới được giới thiệu đã được bao phủ rồi.

Đối với phần tài liệu, đây là bản sao lưu trữ trên sách hướng dẫn cổ điển Martin Harvey. Multithreading - The Delphi Way. Sau khi đọc, bạn sẽ rất có thể nhận ra những gì không có nhu cầu thực sự cho bất kỳ thư viện được đóng góp nào (ngoại trừ, có thể, nhóm chủ đề). không đơn giản hóa mọi thứ cho bạn, họ cũng không cho bạn khỏi sự kiểm soát hạt mịn.

+1

Cũng có sẵn trong CC: [Đa luồng - Cách Delphi (Cập nhật: V 1.1)] (http://cc.embarcadero.com/Item/14809). Đồng thời [Đa luồng - Thư viện thông báo không đồng bộ (V 1.2)] (http://cc.embarcadero.com/Item/21570) –

+0

@TOndrej, phần tiếp theo! :-) Cảm ơn! –

25

[Bạn có thể đặt tên chủ đề:. TThread.NameThreadForDebugging] (thực hiện trong D2010 như David chỉ ra)

Bạn có thể tạo chủ đề nặc danh (a thread thực thi chức năng ẩn danh và không cần một TThread đối tượng hậu duệ): TThread.CreateAnonymousThread.

Delphi khung luồng sẽ được thảo luận ở đây:

+0

Mỉa mai rằng nếu đặt tên đề là tiện dụng, bất kỳ ai cũng muốn tạo một đối tượng chuỗi ẩn danh thậm chí không có hàm liên kết với nó vì nó chỉ là một đóng (một khối mã bên trong một hàm khác). Cá nhân tôi muốn tất cả các mã thread nền của tôi sẽ được chạy từ bên trong một lớp mà xuống từ TThread. –

+1

@Warren Có lý do nào cho mong muốn đó không? –

+1

Warren, không ai dừng bạn :) Tuy nhiên, có những lúc một nhân viên nền ẩn danh đủ điều kiện. – gabr

7

gabr có thể đề cập đến các bổ sung mới chính. Những gì còn lại có thể là các tình trạng quá tải mới cho TThread.Synchronize và TThread.Queue có thể thực hiện các phương thức nặc danh.

12

Tôi nghĩ rằng vấn đề "bản địa" bạn đang nói về không liên quan đến cách TThread được thực hiện, nhưng đến các khía cạnh khác của RTL:

  • Người quản lý bộ nhớ rất nhanh và cũng bằng văn bản, nhưng nó không thể mở rộng theo cách tuyến tính khi chạy với một số luồng đồng thời trên nhiều lõi;
  • loại tham khảo-tính (như stringmảng động) được thực hiện với một opcode asm lock có nguyên tử tham khảo đếm (InterlockedDecrement/InterlockedIncrement trong x64), mà cũng có thể mở rộng quy mô nặng trên các ứng dụng đa luồng (có nghĩa là, tất cả các lõi bị đóng băng khi opcode này được thực hiện - ngay cả khi các CPU mới hơn thực hiện tiến trình về việc này, việc thực hiện RCU có thể mở rộng tốt hơn).

Điểm yếu này phổ biến đối với tất cả thư viện nhiều chủ đề - thậm chí OTL sẽ bị khoảng this. Chúng tồn tại kể từ phiên bản Delphi rất sớm, và vẫn còn đó với Delphi XE2. Việc thực hiện 64 bit là tương tự (thậm chí chậm hơn), và nền tảng Mac OS chia sẻ việc thực hiện rất giống nhau.

Vui lòng xem this other SO question về cách viết các ứng dụng đa luồng trong Delphi.

Thành thật mà nói, cả hai điểm trên sẽ chỉ xuất hiện trên một số loại ứng dụng rất cụ thể.

Vì vậy, không có gì phải lo lắng về đa luồng trong Delphi, nếu bạn biết những điểm đó, và không lạm dụng các cuộc gọi quản lý bộ nhớ hoặc quá trình chuỗi trong chủ đề của bạn.

4

TThreadedQueue được giới thiệu trong XE.

Tôi thấy hữu ích khi chuyển thông tin từ chuỗi công nhân đến chuỗi chính hoặc chuỗi tiêu dùng khác. Phần cuối cùng, có nhiều chủ đề người tiêu dùng, không may là lỗi. Đã có một lỗi trong TMonitor, một lớp được giới thiệu bởi Delphi 2009, được sử dụng để đồng bộ hóa quyền truy cập vào hàng đợi trong TThreadedQueue.

Điều này đã được sửa cho XE2. Xem tthreadedqueue-not-capable-of-multiple-consumers