C++11标准支持了并发,其中包含了线程管理,共享资源保护,线程间同步操作和底层原子操作等功能。我们先通过一个简单的示例看看C++11标准的多线程程序是什么样的。 #include <iostream> #include <thread> // 引用用于管理线程的类的头文件 using namespace std; // 线程的入口函数,程序将在新创建的线程中打印log void hello() { cout << "Hello Concurrent World" << endl; } int _tmain(int argc, _TCHAR* argv[]) { // 构造线程对象t,设置函数hello为其入口函数 thread t(hello); // 线程t被创建后,主线程继续执行,将子线程加入到主线程中,这样主线程就会等待子线程结束 // 否则,主线程可能先于子线程结束而退出 t.join(); return 0; }
#include <thread> #include <iostream> // 线程持有局部变量的指针 struct func { int *i; func(int *i_) : i(i_){ } void operator()() { for (unsigned j = 0; j < 100000; ++j) { *i = j; // 访问非法地址 } } }; // 不等待线程执行完成就退出 void oops() { int some_local_state = 0; func my_func(&some_local_state); std::thread my_thread(my_func); my_thread.detach(); } int _tmain(int argc, _TCHAR* argv[]) { oops(); return 0; }
void do_something_in_current_thread() { throw("error"); } // 不等待线程执行完成就退出 void oops() { int some_local_state = 0; func my_func(&some_local_state); std::thread my_thread(my_func); try { do_something_in_current_thread(); } catch (const char *err_msg) { my_thread.join(); throw; } my_thread.join(); }
class thread_guard { std::thread& t; public: explicit thread_guard(std::thread& t_) : t(t_) { } // 析构函数中检查线程是否还未被join,若没有,则调用 ~thread_guard() { if (t.joinable()) { t.join(); } } // 将拷贝后赋值运算符标记为=delete以避免编译器自动生成,复制或赋值这样一个对象可能很危险,因为它可能比它要结合的线程的作用域存在得更久。 thread_guard(thread_guard const&) = delete; thread_guard& operator=(thread_guard const&) = delete; } |