Passing Arguments to Threads
要想传递参数给线程相关的回调对象或者函数,可以通过在std::thread的构造器中传递,默认情况下,所有的参数都会被拷贝进线程的内部存储。
Passing simple arguments to a std::thread in C++11
1 | void threadCallback(int x, std::string str){ ... } |
How not to pass arguments to threads in C++11
不要将变量的地址从本地栈传递给线程的回调函数,因为线程1中的局部变量可能已经不在作用域,但线程2访问了它的非法地址。
1 | void newThreadCallback(int * p) { ... } |
同样要注意的是,不要把指向位于堆上内存的指针传递进线程,因为有可能在新线程访问之前,原线程已经删除了该内存。
1 | void newThreadCallback(int * p) { ... } |
How to pass references to std::thread in C++11
如果是传递引用,参数会被拷贝进线程栈:
1 | void threadCallback(int const & x) {} //change x |
这种情况下,线程内部对于x的改动,外部域是看不到的。因为线程函数threadCallback中的x引用了在新线程堆栈中复制的临时值。
如果想要外部也是可视的,可以使用std::ref。
1 | void threadCallback(int const & x) {} //hange x |
Assigning pointer to member function of a class as thread function
将指向类成员函数的指针传递给回调函数,并将指针作为第二个参数传递给object:
1 |
|