在优化VTK的渲染机制时,需要将一些流程交给子线程去做,但子线程里的某些函数由要交给主线程去做,所以测试了一个在线程间传递函数的Demo.
#include <iostream>
#include <thread>
#include <functional>
#include <mutex>
#include <condition_variable>
#include <iostream>
#include <thread>
#include <functional>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool done = false;
std::function<void()> func2;
// 第一个函数
void function1() {
std::unique_lock<std::mutex> lock(mtx);
std::cout << "Function 1 in child thread" << std::endl;
}
// 第二个函数
void function2() {
std::cout << "Function 2 in main thread" << std::endl;
done = true;
cv.notify_one();//通知子线程
}
// 第三个函数
void function3() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return done; });
std::cout << "Function 3 in child thread" << std::endl;
}
int main() {
// 创建子线程并执行函数
std::thread t([&]() {
function1();
// 将第二个函数的地址传递给主线程
{
std::unique_lock<std::mutex> lock(mtx);
func2 = function2;
}
cv.notify_one();
function3();
});
// 主线程执行第二个函数
std::function<void()> func2Copy;
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [&] { return func2 != nullptr; });
func2Copy = func2;
}
func2Copy();
t.join();
return 0;
}