#include<iostream>
#include<thread>
#include<Windows.h>
void do_something(unsigned) { std::cout << 1 << ' '; }
struct func {
int& i;
func(int& i_) :i(i_) {}
void operator()() {
for (unsigned j = 0; j < 10; ++j) {
do_something(i);
}
}
};
class scoped_thread {
std::thread t;
public:
explicit scoped_thread(std::thread t_) :t(std::move(t_)) {
if (!t.joinable())
throw std::logic_error("NO thread");//抛异常,当这个线程不能被结合,也就是join或者death的时候就抛出异常
//使用std::logic_error其实和普通的没啥区别,但是好管理一些,看起来标准
}
~scoped_thread() {
//join 等待线程结束 如果没结束就卡在join里面直到结束,执行太快了,我误以为是要join才会打印,其实不需要,我们加一个Sleep就看出来了
//子线程是一个循环,我们这个函数太短了,运行完的时候子线程函数还没运行完,就需要在join卡住才能执行完
Sleep(1000);
t.join();
}
//scoped_thread(std::thread const&) = delete;
scoped_thread operator=(scoped_thread const&) = delete;
};
void f() {
int some_local_state = 0;
scoped_thread t{ std::thread(func(some_local_state)) };
}
int main() {
f();
}
这边是第一个例子,我一开始以为子线程在没有状态的时候不会自己运行,因为我调试多次都只有在join的之后才会得到打印结果,以至于我认为,子线程需要和主线程结合才能打印结果,但是实际是子线程要比主线程复杂,子线程在thread对象赋值的时候就开始运行了,我加了一个Sleep(1000)就能在join之前得到结果
join 等待线程结束 如果没结束就卡在join里面直到结束,执行太快了,我误以为是要join才会打印,其实不需要,我们加一个Sleep就看出来了
子线程是一个循环,我们这个主线程函数太短了,运行完的时候子线程函数还没运行完,就需要在join卡住才能执行完
#include<thread>
#include<iostream>
#include<vector>
void do_word(unsigned id) {
std::cout << id << '\n';
}
void f() {
std::vector<std::thread>threads;
for (unsigned i = 0; i < 20; ++i) {
threads.emplace_back(do_word, i);//生成主线程,此成员函数在C++14添加
}
for (auto& entry : threads)
entry.join();
}
int main() {
f();
}
//因为线程之间的运行速度不一样,所以结果一般都不一样,资源争夺,当thread对象创建好的时候子线程开始运行
编译器支持C++14的可以运行此段代码,每一次结果都不一样,原因是因为多个线程同时运行,无法确定到底哪个线程运行的要快一些打印出来,恰好佐证了我上面的意思。