【问题标题】:C++11 Multithreading with a shared object [duplicate]C ++ 11多线程与共享对象[重复]
【发布时间】:2015-04-20 18:08:07
【问题描述】:

在 C++11 中,我想创建类 FooAlpha(分别为 fooalpha)的对象。然后我想创建一个调用alpha 函数的线程,将foo 作为参数传递。当这个线程运行时,我希望能够修改foo

到目前为止,这是我的代码:

#include <thread>
#include <iostream>

class Foo
{
public:
    int x;
    void Bar()
    {
        std::cout << x << std::endl;
    }
};

class Alpha
{
public:
    void Beta(Foo& foo)
    {
        while (true)
        {
            foo.Bar();
        }
    }
};

int main()
{
    Foo foo;
    foo.x = 5;
    Alpha alpha;
    std::thread beta_thread(&Alpha::Beta, alpha, foo);
    beta_thread.join();

    while (true)
    {
        foo.x++;
    }

    return 0;
}

但是,这给了我一个编译错误:

/usr/include/c++/4.8/functional:1697: error: no type named 'type' in 'class std::result_of<std::_Mem_fn<void (Alpha::*)(Foo&)>(Alpha, Foo)>'
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^

如果我通过值而不是引用 (void Beta(Foo foo)) 传递 foo,那么它可以编译。但是,我认为我需要通过引用传递,这样当我在主循环中修改foo 时,它会更改我传递给Beta 的同一个实例。

有什么帮助吗?

【问题讨论】:

  • 请停止钓鱼,逐步了解答案并了解情况。

标签: c++ multithreading c++11


【解决方案1】:

当您将对象传递给thread 构造函数时,它们会按值获取。如果你想通过引用传递一些东西,你必须说std::ref(foo)

默认的原因是通过值而不是完美转发来获取参数,因为线程的生命周期通常不受范围限制,设计者不想让它很容易被意外创建将本地对象用作参数时的悬空引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 2010-12-25
    • 2018-05-07
    • 1970-01-01
    • 2020-02-23
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多