C++增强.线程:传递对象的方法

C++ Boost.Thread: Passing a method of an object

本文关键字:对象 方法 增强 线程 C++      更新时间:2023-10-16

给定对象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. 如何使用在组中创建线程来运行成员函数

这里有一个例子:

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的同一实例(客户端)的不同线程。

如果使用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。