c ++中的多线程

时间:2017-10-26 17:24:17

标签: c++ multithreading

我有一个名为MatrixAlt的类,我正在尝试多线程函数来对该矩阵进行一些处理。

当我在几个函数中实现它时,我的一般方法有效。但是当我尝试将它带入类方法时,我得到一个错误。

有问题的行(或者它突出显示的位置)是从末尾开始的4行,错误消息位于其上方的注释中。

#include <vector>
#include <future>
#include <thread>

class MatrixAlt
{
    public:
    MatrixAlt();

    // initilaise the matrix to constant value for each entry
    void function01(size_t maxThreads);
    void function02(size_t threadIndex);

};

MatrixAlt::MatrixAlt()
{

}

void MatrixAlt::function02(size_t threadIndex)
{
    // do some stuff 
    return;

}


void MatrixAlt::function01(size_t maxThreads)
{

    // To control async threads and their results
    std::vector<std::future<bool>> threadsIssued;

    // now loop through all the threads and orchestrate the work to be done
    for (size_t threadIndex = 0; threadIndex < maxThreads; ++threadIndex)
    {
        // line 42 gives error:
        // 'MatrixAlt::function02': non-standard syntax; use '&' to create a pointer to member
        // 'std::async': no matching overloaded function found
        threadsIssued.push_back(std::async(function02, threadIndex));
    }
    return;
}

2 个答案:

答案 0 :(得分:1)

你的第一个问题就像这样解决了

threadsIssued.push_back(std::async(&MatrixAlt::function02, this, threadIndex));

您需要指定确切的类::函数,并将其地址用于执行该类的实例,然后再参数。

你还没有看到的第二个问题是这一行

 std::vector<std::future<bool>> threadsIssued;

所有这些未来都会在范围退出时丢失,就像雨中的泪水一样。是时候毁灭了。

刀锋之后自由行动。

  

所有这些时刻都将在时间中消失,就像雨中的泪水一样。时间到了   死。

答案 1 :(得分:0)

每当在C ++中有成员函数时,该函数将对象本身作为隐式的第一个参数。所以你也需要传递对象,但即使这样,它也不能用与获取对象的普通函数相同的语法来调用。

在C ++中设置异步作业的最简单方法通常就是使用lambdas。他们非常清楚明确。因此,例如,您可以将呼叫更改为:

threadsIssued.push_back(std::async([this] (size_t t) { this->function02(t);}, threadIndex));

这个lambda显式捕获this指针,它告诉我们所有function02调用都将在调用调用function01的同一对象上调用。

除了正确和明确之外,这还有助于突出重点:所有function02个对象都将以对同一MatrixAlt对象的可变访问权运行。这是非常危险的,所以你需要确保function02是线程安全的,无论如何(如果它在概念上很常见,通常很容易,否则可能需要互斥,或其他)。