VC ++中的MultiThread程序

时间:2015-07-26 23:30:19

标签: c++ multithreading

我正在尝试使用线程化应用程序在将它们排入后无限地打印一组数字。我收到这个错误:

错误1错误C3867:'Test :: ThreadFunc':函数调用缺少参数列表;使用'& Test :: ThreadFunc'创建指向成员的指针。

我做错了什么?这是什么错误?

#include "stdafx.h"

#include <chrono>
#include <mutex>
#include <thread>
#include <list>

class Test {
    std::list<int> queue;
    std::mutex m;

public:
    void ThreadFunc()
    {
        // Loop is required, otherwise thread will exit
        for (;;)
        {
            bool read = false;
            int value;
            {
                std::lock_guard<std::mutex> lock(m);

                if (queue.size())
                {
                    value = queue.front();
                    read = true;
                    queue.pop_back();
                }
            }

            if (read)
            {
                // send(header.data(), header.dataSize());
                // send(proto.data(), proto.dataSize());
                printf("Hello %d\n", value);
            }

            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
    }

    void TestFunc()
    {
        std::thread thread(ThreadFunc);
        thread.detach();

        int i = 0;
        // Loops only as a test example
        for (;;)
        {
            std::lock_guard<std::mutex> lock(m);
            std::this_thread::sleep_for(std::chrono::milliseconds(2000));
            queue.push_back(i++);
            // Queue Message(header, payload);
        }
    }

};

int main()
{
    Test test;
    test.TestFunc();
}

3 个答案:

答案 0 :(得分:1)

您尝试将指针传递给类的成员函数。执行此操作时,默认情况下会向函数添加一个参数,该参数指向您正在调用该函数的类的实例。在您的情况下,指向类的指针将是this指针。

有关语法参考,请参阅此处:Start thread with member function

要回答你的评论,为什么它没有被隐含地传递?您没有将该函数作为类的成员调用,您通过指针传递成员函数。这是一个不同的,独特的情况,请参阅此参考:Passing a member function as an argument in C++

另外,为了节省一点未来的麻烦,下一个问题是std :: thread的构造函数按值获取其参数,因此如果需要通过引用传递任何参数,请查看的std :: REF。

答案 1 :(得分:0)

这是修复。这有效。谢谢@mock_blatt

#include "stdafx.h"

#include <chrono>
#include <mutex>
#include <thread>
#include <list>



class Test {
std::list<int> queue;
std::mutex m;

public:
    void ThreadFunc()
    {
        // Loop is required, otherwise thread will exit
        for (;;)
            {
                bool read = false;
                int value;
                {
                    std::lock_guard<std::mutex> lock(m);

                    if (queue.size())
                    {
                        value = queue.front();
                        read = true;
                        queue.pop_back();
                    }
                }

        if (read)
        {
        // send(header.data(), header.dataSize());
        // send(proto.data(), proto.dataSize());
            printf("Hello %d\n", value);
        }

        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

 void TestFunc()
 {
    std::thread thread(std::bind(&Test::ThreadFunc, this));
    thread.detach();

    int i = 0;
    // Loops only as a test example
    for (;;)
    {
        std::lock_guard<std::mutex> lock(m);
        std::this_thread::sleep_for(std::chrono::milliseconds(2000));
        queue.push_back(i++);
        // Queue Message(header, payload);
    }
}

};

int main()
{
 Test test;
test.TestFunc();
}

答案 2 :(得分:0)

std::thread thread(ThreadFunc);更改为std::thread thread(Test::ThreadFunc, this);