2012-07-09 27 views
8

Trong ghi chú phát hành của phiên bản 1.50.0 của các thư viện Boost tôi ghi nhận hai sự thay đổi phá vỡ (see here):thay đổi Breaking trong Boost.Thread 3.0.0

# 6266 thay đổi Breaking: chủ đề destructor nên gọi chấm dứt nếu có thể tham gia.

# 6269 Thay đổi ngắt: chuyển nhượng chuỗi chỉ nên gọi chấm dứt nếu có thể tham gia.

Điều này có ý nghĩa gì đối với các dự án hiện tại của tôi hiện đang sử dụng Boost 1.49.0? Tôi có phải thay đổi gì không? Nếu có, tôi phải thay đổi chính xác điều gì? Và điều gì sẽ xảy ra nếu tôi quên sửa đổi một trong những dự án hiện tại của mình? Tôi sẽ nhận được lỗi thời gian biên dịch (tôi hy vọng như vậy) hoặc tôi sẽ nhận được khó khăn và khó tìm thấy các vấn đề thời gian chạy (Tôi hoàn toàn không hy vọng như vậy)?

Trả lời

7

Khi nói "Thay đổi đột xuất", có nghĩa là "Chương trình của bạn bị hỏng nếu bạn phụ thuộc vào hành vi trước đây X, nhưng giờ là Y".

Đối với cho hai sự thay đổi, nó có nghĩa là nếu bạn dựa vào các destructor hoặc di chuyển nhượng gọi join() (hoặc detach()), mà tôi tin là hành vi trước, chương trình của bạn phải hiện rõ ràng join() hoặc detach() hoặc gặp gỡ bạn bè của bạn std::terminate() . Nó không phải là một lỗi biên dịch-thời gian, nhưng cũng không phải là không thể đoán trước thời gian chạy behaviour- bạn sẽ nhận được một vụ tai nạn sạch đẹp dẫn ngay trở lại boost::thread 's destructor, đó là nguyên nhân của vấn đề.

+1

Lưu ý rằng nó gọi chấm dứt nếu có thể tham gia, nghĩa là nó sẽ không chấm dứt nếu đối tượng chuỗi không được nối trước đó nhưng được tách ra. – PlasmaHH

+1

Có, tôi quên mất 'tách()'. – Puppy

7

Các mã sau sử dụng để làm việc một cách chính xác, nhưng với v3 chương trình sẽ được hủy bỏ như t lá phạm vi của nó, bởi vì thread::~thread cuộc gọi std::terminate, thay vì âm thầm tách từ chủ đề:

#include <boost/thread.hpp> 
#include <iostream> 

void f() 
{} 

int main() 
{ 
    { 
    boost::thread t(f); 
    } 
    std::cout << "exiting gracefully" << std::endl; 
} 
Các vấn đề liên quan