का उपयोग करते समय मुख्य() बाहर निकलने के बाद बुलाया जाता है यदि निम्नलिखित उदाहरण उबंटू 12.04 पर क्लैंग 3.2 या जीसीसी 4.7 का उपयोग करके संकलित किया गया है तो निम्नलिखित उदाहरण सफलतापूर्वक चलाया जाता है (यानी लटका नहीं है), लेकिन हैंग अगर मैं वीएस 11 बीटा या वीएस2012 आरसी का उपयोग कर संकलित करता हूं।std :: thread :: join() vs2012 आरसी
#include <iostream>
#include <string>
#include <thread>
#include "boost/thread/thread.hpp"
void SleepFor(int ms) {
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
}
template<typename T>
class ThreadTest {
public:
ThreadTest() : thread_([] { SleepFor(10); }) {}
~ThreadTest() {
std::cout << "About to join\t" << id() << '\n';
thread_.join();
std::cout << "Joined\t\t" << id() << '\n';
}
private:
std::string id() const { return typeid(decltype(thread_)).name(); }
T thread_;
};
int main() {
static ThreadTest<std::thread> std_test;
static ThreadTest<boost::thread> boost_test;
// SleepFor(100);
}
मुद्दा है कि std::thread::join()
कभी नहीं देता है अगर यह बाद main
से बाहर निकल गया है शुरू हो जाती है प्रकट होता है। इसे WaitForSingleObject
पर _Thrd_join
में cthread.c में परिभाषित किया गया है।
के अंत में SleepFor(100);
को प्रोग्राम को ठीक से बाहर निकलने की अनुमति देता है, क्योंकि std_test
गैर स्थैतिक बनाता है। boost::thread
का उपयोग भी इस मुद्दे से बचाता है।
तो मैं जानना चाहता हूं कि क्या मैं यहां अपरिभाषित व्यवहार का आह्वान कर रहा हूं (मुझे असंभव लगता है), या अगर मुझे वीएस2012 के खिलाफ एक बग दर्ज करना चाहिए?
बीटा और रिलीज उम्मीदवार मुद्दे? – Jaywalker
@ जयवाकर मुझे लगता है कि मैं यही पूछ रहा हूं। क्या 'मुख्य' बाहर निकलने के बाद इसे शामिल होने पर 'शामिल() 'लटका नहीं होना उचित है। यदि ऐसा है, तो यह एक बग है जिसे मैं जल्द ही बाद में एमएस कनेक्ट में प्राप्त करना चाहता हूं। – Fraser
क्या आप परीक्षण करने का प्रयास कर सकते हैं कि 'std :: thread :: joinable() 'अभी भी लटकने से पहले सच हो जाता है? – Plexico