2008-10-29 24 views
8

Tôi đã phát hiện qua thử và sai rằng chức năng của động cơ MATLAB không hoàn toàn an toàn.An toàn chủ đề của động cơ Matlab API

Có ai biết quy tắc không?

Được phát hiện thông qua quá trình dùng thử và lỗi:

Trên Windows, kết nối với MATLAB là qua COM, do đó, quy tắc luồng căn hộ COM áp dụng. Tất cả các cuộc gọi phải xảy ra trong cùng một luồng, nhưng nhiều kết nối có thể xảy ra trong nhiều chủ đề miễn là mỗi kết nối bị cô lập.

Từ các câu trả lời dưới đây, có vẻ như đây không phải là trường hợp trên UNIX, nơi các cuộc gọi có thể được thực hiện từ nhiều chủ đề miễn là các cuộc gọi được thực hiện serially.

+0

afaik MATLAB động cơ được thực hiện sử dụng COM trên Windows, và sử dụng ống trên Unix: http://www.mathworks.com/help/matlab/matlab_external/ using-matlab-engine.html – Amro

Trả lời

3

Khi lần đầu tiên tôi bắt đầu sử dụng động cơ, tôi đã không chạy qua bất kỳ tài liệu nào về an toàn luồng, vì vậy tôi cho rằng nó không an toàn chỉ.

Tôi sử dụng lớp C++ để đồng bộ hóa quyền truy cập vào phiên bản công cụ. Đối với các thiết kế xử lý song song hơn, tôi khởi tạo nhiều phiên bản của lớp động cơ.

(chỉnh sửa) Tôi đang sử dụng MATLAB R14 trên Solaris. Tôi mở công cụ bằng cách sử dụng cuộc gọi 'engOpen' và đóng nó bằng 'engClose'. Nền tảng của tôi không sụp đổ khi Close được gọi bởi một luồng khác với cái được gọi là Mở.

1

Từ góc nhìn của người dùng, trình thông dịch của Matlab hoàn toàn đơn luồng. Để được an toàn, bạn có thể cần phải làm cho tất cả các truy cập vào động cơ từ một sợi đơn.

Lưu ý rằng nội bộ, Matlab sử dụng nhiều chuỗi. Có các chủ đề GUI, và trong một vài phiên bản trước, người thông dịch có thể sử dụng nhiều chủ đề đằng sau hậu trường. Tuy nhiên, thông dịch viên là tương đương về mặt ngữ nghĩa với một thông dịch viên đơn luồng (có ngắt).

1

Bạn có thể sử dụng engOpenSingleUse thay vì sử dụng engOpen để tạo nhiều hơn một chuỗi hoạt động riêng biệt. (Chỉ Windows)

6

Từ documentation,

MATLAB libraries are not thread-safe. If you create multithreaded applications, make sure only one thread accesses the engine application.

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