2009-12-01 23 views
9

Tôi đọc ở nhiều nơi Boost.Signals không phải là chủ đề an toàn nhưng tôi không tìm thấy nhiều chi tiết hơn về nó. Trích dẫn đơn giản này không nói nhiều lắm. Hầu hết các ứng dụng ngày nay đều có các luồng - ngay cả khi chúng cố gắng đơn luồng, một số thư viện của chúng có thể sử dụng các luồng (ví dụ: libsdl).Boost: chính xác thì không phải là luồng an toàn trong Boost.Signals?

Tôi đoán việc triển khai không có vấn đề với các chủ đề khác không truy cập vào vị trí. Vì vậy, nó là ít nhất threadsafe trong ý nghĩa này.

Nhưng chính xác những gì hoạt động và những gì sẽ không hoạt động? Nó sẽ làm việc để sử dụng nó từ nhiều chủ đề miễn là tôi không bao giờ truy cập nó cùng một lúc? I E. nếu tôi xây dựng các mutex của riêng mình xung quanh khe cắm?

Hoặc tôi có buộc phải sử dụng vị trí chỉ trong chuỗi đó mà tôi đã tạo nó không? Hoặc nơi tôi sử dụng nó lần đầu tiên?

+0

Đã lâu rồi ... câu trả lời của tôi có hợp lý không? Về cơ bản các thư viện tín hiệu * chính nó * sẽ không sụp đổ bất kể các cuộc gọi bạn thực hiện từ bất kỳ chủ đề miễn là chúng là "hợp lệ" ... nhưng bạn chịu trách nhiệm về ngữ nghĩa trong mã của riêng bạn. – HostileFork

+0

Yea nó có ý nghĩa nhưng nó không thực sự trả lời tất cả các câu hỏi của tôi. :) Về cơ bản bạn nói "tra cứu nó trong nguồn". Tôi sẽ làm điều đó tại một số điểm sau đó và sau đó đăng tất cả các câu trả lời chính xác cho câu hỏi của tôi ở đây. – Albert

+0

Bạn đã hỏi "chính xác những gì hoạt động và những gì sẽ không hoạt động?" Tôi cảm thấy đó là điều cần thiết hơn là mổ xẻ những câu hỏi cụ thể hẹp hơn của bạn.(Những câu trả lời là "Có: nếu bạn bảo vệ với một mutex tốt, nhưng có thể không cần thiết nếu ngữ nghĩa của các khe của bạn sao cho nhiều hơn một luồng có thể chạy chúng cùng một lúc; nó giống như gọi bất kỳ hàm nào khác từ nhiều chuỗi" và "Không: bạn không bị giới hạn chỉ sử dụng các vị trí trong chuỗi mà chúng được tạo.") – HostileFork

Trả lời

5

Tôi không nghĩ rằng nó quá rõ ràng một trong hai, và một trong những người nhận xét thư viện said here:

Tôi cũng không thích thực tế là chỉ có ba lần so với từ 'chủ đề' được đặt tên. Boost.signals2 muốn trở thành thư viện 'an toàn chủ đề'. Do đó, cần thêm một số chi tiết và đặc biệt là các ví dụ khác về khu vực đó cho người dùng.

Một cách để tìm hiểu là go to the source và xem những gì họ đang sử dụng _mutex/lock() để bảo vệ. Sau đó, hãy tưởng tượng điều gì sẽ xảy ra nếu những cuộc gọi đó không có ở đó. Từ những gì tôi có thể thu thập, nó đảm bảo những thứ đơn giản như "nếu một sợi đang kết nối hoặc ngắt kết nối, điều đó sẽ không gây ra một luồng khác đang lặp qua các khe gắn với các tín hiệu đó". Loại giống như cách sử dụng một phiên bản an toàn thread của thư viện thời gian chạy C đảm bảo rằng nếu hai chủ đề thực hiện cuộc gọi hợp lệ đến printf cùng một lúc thì sẽ không có sự cố. (Không nói đầu ra bạn sẽ nhận được sẽ có nghĩa là — bạn vẫn chịu trách nhiệm về ngữ nghĩa bậc cao hơn.)

Nó có vẻ không giống như Qt, trong đó chủ đề một vị trí nhất định mã được chạy dựa trên "mối quan hệ luồng" của mục tiêu (có nghĩa là phát ra tín hiệu có thể kích hoạt các khe trên nhiều luồng khác nhau để chạy song song). Nhưng tôi đoán không hỗ trợ đó là lý do tại sao bộ tăng "tín hiệu" có thể do things like this.

0

Một vấn đề tôi thấy là một sợi có thể kết nối hoặc ngắt kết nối trong khi một luồng khác đang báo hiệu.

Bạn có thể dễ dàng quấn tín hiệu và kết nối cuộc gọi bằng các mutex. Tuy nhiên, nó là không tầm thường để quấn các kết nối. (kết nối trả về các kết nối mà bạn có thể sử dụng để ngắt kết nối).

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