#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
class ThreadInfo;
std::vector<ThreadInfo> g_thread_info;
std::mutex print_m;
class ThreadInfo
{
public:
int begin_, end_;
std::thread thread_;
ThreadInfo(int begin, int end) : begin_(begin), end_(end)
{
thread_ = std::thread(&ThreadInfo::HandleRange, this);
}
ThreadInfo(ThreadInfo&& info)
{
std::cout << " move constructor" << std::endl;
begin_ = info.begin_;
end_ = info.end_;
thread_ = std::move(info.thread_);
}
~ThreadInfo()
{
std::cout << "~ThreadInfo" << std::endl;
}
public:
void HandleRange()
{
std::lock_guard<std::mutex> lk(print_m);
std::cout << " " << begin_ << " " << end_ << std::endl;
}
};
int main()
{
//g_thread_info.reserve(10);
for (int i = 0; i < 20; i += 5)
{
g_thread_info.emplace_back(i, i + 5);
}
getchar();
return 0;
}
代码打印出来是随机数,原因是g_thread_info,动态扩容导致this指针失效,析构了,这样thread中访问的变量都是随机值。
加上reserve打印就正常了。
这里vector存的是对象,如果改成存的数据是shared_ptr则没事。
大神的建议: