gpt4 book ai didi

c++ - 线程函数中的通用引用

转载 作者:行者123 更新时间:2023-11-28 01:38:27 25 4
gpt4 key购买 nike

我一直在学习完美转发和 && 在函数模板中的使用(参见我的 this previous question),想知道我是否在 StartDetachedThread() 中使用了 Args&& 下面是合理的:

#include <thread>

class CObject {};
void MyThreadFunc(CObject&)
{
}

// ** Will not compile with this function declaration! **
void MyThreadFunc(CObject&&)
{
}

template<typename FunctionType, typename ...Args>
void StartDetachedThread(FunctionType func, Args&&... args)
{
thread([&]()
{
func(forward<Args>(args)...);
}).detach();
}

int main()
{
CObject object;
StartDetachedThread(MyThreadFunc, object);

CObject object2;
StartDetachedThread(MyThreadFunc, std::move(object2));
return 0;
}

此代码只是创建一个分离线程,运行提供的函数并将提供的参数传递给它。

然而,VS 2017 提示:

'StartDetachedThread': no matching overloaded function found
'void StartDetachedThread(FunctionType,Args &&...)': could not deduce template argument for 'FunctionType'

1) 我知道传递给 thread 构造函数的参数首先被复制,然后通过引用传递给新线程,所以我尝试让 MyThreadFunc(CObject&&) 当我传递一个永远不会起作用的右值引用时被调用?

2) StartDetachedThread(FunctionType&& func, Args&&... args) 是否有任何值(value) - 或者对于 FunctionType 是否不需要 && >?

3) 在像这样启动线程时使用 Args&& 有任何值(value),还是我应该始终使用 Args

最佳答案

您代码中的问题与 std::thread 无关,这是因为 MyThreadFunc 在这种情况下不明确:

// Which MyThreadFunc should be used?
StartDetachedThread(MyThreadFunc, object);

关于您的问题:

1) I know that arguments passed to the thread constructor are copied first, then passed by reference to the new thread, [...]

在您的示例中,唯一的拷贝是 lambda 的拷贝。这里没有复制参数,如果你想复制参数你应该使用这样的东西:

std::thread(std::move(func), std::forward<Args>(args)...).detach();

...将参数转发给 std::thread 构造函数的地方。

这样更安全。 — 想想如果函数 StartDetachedThread 在线程仍在运行时结束会发生什么?

如果你使用这个,你需要通过std::ref明确地告诉编译器你想调用object1的引用版本:

CObject object;
StartDetachedThread<void (CObject&)>(MyThreadFunc, std::ref(object)); // std::ref

CObject object2;
StartDetachedThread<void (CObject&&)>(MyThreadFunc, std::move(object2));

2) Is there any value in having StartDetachedThread(FunctionType&& func, Args&&... args) - or is the && unnecessary for FunctionType?

3) Is there any value whatsoever in using Args&& when starting a thread like this, or should I always use Args?

使用转发引用允许您调用 StartDetachedThread 而无需移动所有内容。如果您使用上述方式构造一个std::thread,那么无论如何都会为funcargs 制作拷贝。

关于c++ - 线程函数中的通用引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48339891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com