2013-07-03 650 views
10

Tôi đang cố gắng đặt std::string s vào boost::lockfree::queue s để chủ đề của tôi có thể cập nhật lẫn nhau với dữ liệu mới.cách đặt std :: string into boost :: lockfree :: queue (hoặc thay thế)?

Khi tôi cố gắng sử dụng boost::lockfree::queue<std::string> updated_data;, g++ nói:

In instantiation of 'class boost::lockfree::queue >':

error: static assertion failed: (boost::has_trivial_destructor::value)

error: static assertion failed: (boost::has_trivial_assign::value)

Tôi đã shown generally what these errors mean, nhưng tôi không có hy vọng bao giờ sửa chữa này bản thân mình, như tôi là gần như hoàn toàn mới để C++.

Có cách nào khác để truyền dữ liệu văn bản giữa các chủ đề với lockfree không? Nếu không, vui lòng chỉ cho tôi cách đặt std::string vào một số boost::lockfree::queue.

Trả lời

2

Nếu bạn đặt con trỏ thô trong hàng đợi, số std::strings cũ sẽ bị rò rỉ, vì không có cách nào để giải phóng chúng khi chúng không còn cần thiết nữa. Điều này là do không có cách nào để giải phóng các đối tượng theo cách an toàn mà không cần khóa (trừ một số thủ thuật như con trỏ nguy hiểm, mà boost::lockfree::queue không sử dụng)

Vì lý do kỹ thuật, tôi thực sự không hiểu, boost::lockfree::queue yêu cầu một toán tử gán tầm thường và một destructor nhỏ, có nghĩa là đối tượng của bạn không thể cũng không chứa bất kỳ kiểu dữ liệu nào phải giải phóng bộ nhớ trong destructor của nó, như std::string.

+2

Điều này là không hoàn toàn đúng: bạn có thể đặt con trỏ nguyên trong hàng đợi và giải phóng chúng khi bạn bật con trỏ. ví dụ 'queue-> consum_all ([] (std :: string * str) {do_something (str); delete str;});' – Zero

10

Tài liệu boost::lockfree::queue nêu rõ mục được chứa phải có phân bổ và hủy bản sao tầm thường, mà std::string không có.

Nếu bạn có một nhà sản xuất và một người tiêu dùng duy nhất, bạn có thể sử dụng spsc_queue (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/lockfree/spsc_queue.html) chỉ yêu cầu khả năng xây dựng và khả năng sao chép mặc định.

Nếu bạn có nhiều nhà sản xuất hoặc người tiêu dùng, bạn sẽ bị mắc kẹt với hàng đợi khóa bình thường (hoặc chuỗi tùy chỉnh không sử dụng phân bổ động).

+0

Cảm ơn bạn, hãy đứng đầu trên spsc_queue! – Austin

8

I have no hope of ever fixing this myself, as I'm almost brand new to c++.

Sau đó, tôi tự hỏi tại sao bạn đang rối tung với những thứ như hàng đợi lockfree.

Is there an alternative way to pass text data between threads with lockfree ?

Vâng, bạn chỉ có thể lưu trữ một con trỏ std::string* số liệu trong hàng đợi, bởi vì một con trỏ là một loại tầm thường và vì vậy được phép trong hàng đợi. Tương tự, bạn có thể lưu trữ reference_wrapper<std::string>. Vấn đề là bạn cần lưu trữ các chuỗi ở nơi khác, để có thể trỏ đến chúng, vì vậy bây giờ tất cả những gì bạn đã làm là di chuyển vấn đề đến một nơi khác (ví dụ: bạn có thể duy trì danh sách các chuỗi trong mỗi chuỗi và lưu trữ con trỏ tới chuỗi được quản lý bên ngoài trong hàng đợi không khóa, nhưng bạn không biết khi nào an toàn để xóa một số string khỏi danh sách cho mỗi chuỗi để nó phát triển và tăng trưởng.)

Tôi khuyên bạn nên bạn sử dụng một đơn giản std::queue<std::string> và thực hiện đồng bộ hóa của riêng bạn với boost::mutexboost::condition_variable hoặc tìm một triển khai hiện có của một hàng đợi an toàn (không khóa)!

+0

Điều này được +1 bởi vì tôi thậm chí không xem xét lưu trữ các con trỏ thô trong hàng đợi. –

+0

Làm gì, lưu trữ các con trỏ thô? Nó sẽ đặt các vật thể thực sự ở đâu?Nói chung là không tốt để đưa con trỏ không được quản lý vào thùng chứa, quá dễ bị rò rỉ bộ nhớ –

+0

Vậy thì bạn đã giải quyết được vấn đề, bây giờ nó chỉ là một vấn đề đơn giản (http: //www.catb) .org/jargon/html/S/SMOP.html);) –