c++ बूस्ट में परिवर्तन तोड़ते हैं। धागा 3.0.0




boost boost-thread (2)

बूस्ट पुस्तकालयों के संस्करण 1.50.0 के रिलीज नोट्स में मैंने दो तोड़ने वाले परिवर्तनों को देखा ( देखें यहाँ ):

# 6266 ब्रेकिंग परिवर्तन: धागा डिस्ट्रिक्टर को कॉल करने पर कॉल करना चाहिए।

# 6269 ब्रेकिंग परिवर्तन: धागा कदम असाइनमेंट को कॉल करने पर कॉल करना चाहिए।

वर्तमान में बूस्ट 1.49.0 का उपयोग करते हुए मेरे मौजूदा प्रोजेक्ट का क्या अर्थ है? क्या मुझे कुछ भी बदलना है? यदि हां, तो मुझे क्या बदलना है? और अगर मैं अपनी मौजूदा परियोजनाओं में से एक को संशोधित करना भूल जाता हूं तो क्या होगा? क्या मैं समय की त्रुटियों को संकलित करूँगा (मुझे आशा है) या मुझे गंदा और मुश्किल से ढूंढने वाली रनटाइम की समस्याएं मिलेंगी (मुझे पूरी तरह से उम्मीद नहीं है)?


जब यह "ब्रेकिंग चेंज" कहता है, इसका मतलब है, "आपका प्रोग्राम टूट गया है यदि आप पहले से एक्स के व्यवहार पर निर्भर हैं, लेकिन अब Y" है।

दिए गए दो परिवर्तनों के लिए, इसका मतलब है कि यदि आप डिस्ट्रक्टर पर भरोसा करते हैं या असाइनमेंट को कॉलिंग कॉलिंग join() (या detach() ) पर निर्भर करते हैं, जो मुझे लगता है कि यह पिछले व्यवहार था, तो आपका प्रोग्राम अब स्पष्ट रूप से join() होना चाहिए join() या detach() या अपने मित्र से मिलने std::terminate() यह एक संकलन-समय की त्रुटि नहीं है, न ही यह अप्रत्याशित रन-टाइम व्यवहार है- आपको boost::thread लिए ठीक से एक अच्छा साफ दुर्घटना होगी boost::thread के नाशक, जो कि समस्या का कारण है


निम्नलिखित कोड को सही तरीके से काम करने के लिए प्रयोग किया जाता था, लेकिन v3 के साथ प्रोग्राम को रद्द कर दिया जाएगा क्योंकि t दायरे को छोड़ दिया जाएगा, क्योंकि thread::~thread कॉल std::terminate , चुपचाप धागा से अलग होने के बजाय:

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

void f()
{}

int main() 
{ 
  {
    boost::thread t(f);
  }
  std::cout << "exiting gracefully" << std::endl;
} 




boost-thread