我可以使用类中定义的友元函数作为我的线程函数吗

问题描述 投票:0回答:1

我是 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 中的其他材料

c++ c++11 pthreads friend-function
1个回答
1
投票

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
都没有意义。


该函数是类的友元,与将其传递给线程构造函数无关。它的工作原理与任何其他免费功能一样,如果不是朋友,您会得到相同的错误。

© www.soinside.com 2019 - 2024. All rights reserved.