我是 C++ 新手,正在尝试理解线程中的概念。我围绕这个问题的阅读材料是“Anthony Williams - C++ Concurrency in Action” - 清单 3.6。我自己编写了清单,但似乎无法让代码正常工作。我相信我面临的问题是将类内友元函数调用为线程函数,我也参考了this文章。
这是我的代码
#include <iostream>
#include <mutex>
#include <thread>
class some_big_object
{
};
void swap(some_big_object &lhs, some_big_object &rhs);
class X
{
private:
some_big_object some_detail;
std::mutex m;
public:
X(some_big_object const &sd) : some_detail(sd) {}
friend void swap(X &lhs, X &rhs)
{
if (&lhs == &rhs)
{
return;
}
std::lock(lhs.m, rhs.m);
std::lock_guard<std::mutex> lock_a(lhs.m, std::adopt_lock);
std::lock_guard<std::mutex> lock_b(rhs.m, std::adopt_lock);
swap(lhs.some_detail, rhs.some_detail);
}
};
int main(void)
{
some_big_object s1;
some_big_object s2;
X a(s1);
X b(s2);
std::thread t1(swap(a, b));
t1.join();
return 0;
}
谢谢你
我尝试参考文章,以及Tutorials Point 和 GeekforGeeks 中的其他材料
std::thread t1(swap(a, b));
调用 swap(a,b)
并将返回值传递给 std::thread
。如果您希望线程调用 swap(a,b)
那么您需要向其传递函数和参数
std::thread t1(swap,std::ref(a),std::ref(b));
需要 std::ref
来避免构造函数复制参数并使用引用。
假设函数是
int foo(int a,int b) { return a+b; }
也许现在更清楚为什么
std::thread t1(foo(a,b))
不可能是正确的。 foo(a,b)
调用该函数,并将结果传递给线程的构造函数,即int
。在你的情况下,swap
返回void
,并且无论g(swap(a,b))
是什么函数,g
都没有意义。
该函数是类的友元,与将其传递给线程构造函数无关。它的工作原理与任何其他免费功能一样,如果不是朋友,您会得到相同的错误。