【问题标题】:C++ Boost.Thread: Passing a method of an object [duplicate]C ++ Boost.Thread:传递对象的方法[重复]
【发布时间】:2015-06-17 20:32:43
【问题描述】:

给定对象 x,我想启动一个新线程来调用 x.a() 甚至是 x.a(1,2,3)。我可以使用boost::thread 为非成员函数执行此操作;但是如何为成员函数执行此操作?如何传递this 指针?

一般来说,有很多 STL 和 Boost 代码和模板将代码作为参数,但是,因为这在 C++ 中并没有真正定义(函数不是一流的 val,没有原生 lambda 支持),所以我是非常困惑它们是如何定义的。我可以反复试验,但我想要更清晰、更可靠的东西。

更新:我的问题主要涉及传递一个方法;当我尝试做明显的语法(ClassName::method_name, instance)时,我得到invalid use of non-static member functionerror: no matching function to call。如果您能展示在非静态方法上使用 Boost.thread 的正确语法,将会有所帮助。

更新 2:我找到了为什么要为此苦苦挣扎。给出的答案(例如@OrDinari)非常适合boost::thread。但是,当我尝试使用thread_group,即thread_group::create_thread 时,我得到了这个错误:

 error: no matching function for call to ‘boost::thread_group::create_thread(void (C::*)(), C*)’

所以:

  1. 为什么它适用于单线程而不适用于线程组?
  2. 如何使用在组中创建线程来运行成员函数?

【问题讨论】:

  • C++ 确实支持原生 lambda。
  • 如果您是原始野蛮人,也可以使用 boost::bind。
  • 这已经在 StackOverflow 上被回答了一百万次
  • @πάνταῥεῖ,你为什么要使用bind?简单的thread t(&X::a, &x, 1, 2, 3) 有什么问题?

标签: c++ multithreading boost boost-thread


【解决方案1】:

这是一个例子:

        boost::thread _commandControl(&Client::commandControl, &client);

这将使用客户端对象方法 commandControl 从名为 client 的客户端实例创建一个新线程。

这里的代码有点大,可能更容易理解:

Client client(host, port);
std::cout << "Pick interface (1) Terminal  (2) Menu:\n";
char interfaceMode;
std::cin >> interfaceMode;
while (!client.setMode(interfaceMode)) {
    std::cout << "\nInvalid choice! try again (1) For Terminal  (2)For Menu:";
    std::cin >> interfaceMode;
}
try {
    std::cin.ignore();
    if (client.connect()) {
        try {

            boost::thread _commandControl(&Client::commandControl, &client);
            boost::thread _checkQueue(&Client::checkQueue, &client);
            _checkQueue.join();
            if (client.checkAlive() == false)throw ConnectionDCexception();
            _commandControl.join();
            client.close();
        }
        catch (std::exception &e) {
            std::cout << "\n" << e.what();
        }
    }
    else {
        std::cout << "\nFailed to initiate connecting, exiting...";
    }
}

你要找的主要是:

Client client(host, port);

boost::thread _commandControl(&Client::commandControl, &client);
boost::thread _checkQueue(&Client::checkQueue, &client);

每个都是不同的线程,来自类 Client 的同一个实例(客户端)。

【讨论】:

  • 谢谢 - 请查看线程组失败的更新。可以看看吗?
【解决方案2】:

如果你使用 C++11,你可以使用 lambdas:

#include <iostream>
#include <thread>

class Foo
{
public:
    void foo()
    {
        std::cout << "Foo thread: " << std::this_thread::get_id() << std::endl;
    }
};

int main() {
    std::cout << "Main thred: " << std::this_thread::get_id() << std::endl;

    Foo foo;
    std::thread t1( [&foo] () {foo.foo();} );
    t1.join();

    return 0;
}

您可以将 std::thread 替换为 boost::thread。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2023-03-09
    • 2016-03-26
    • 2012-09-15
    • 2016-07-12
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多