C++增强.线程:传递对象的方法
C++ Boost.Thread: Passing a method of an object
给定对象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 function
error: 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*)’
因此:
- 为什么它适用于单线程而不适用于线程组
- 如何使用在组中创建线程来运行成员函数
这里有一个例子:
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。
- 使用std::函数映射对象方法
- 正在调用shared_ptr对象方法
- 检查哪个对象调用了另一个对象的对象方法
- 如何在C++中循环访问未知对象方法?
- c++ 替换调用对象方法的宏函数
- 我能否通过将函数实现为类对象方法来避免使用互斥锁
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 如何让两个不同的对象方法相互用作参数
- 在创建 c++ 期间调用对象方法
- 扩展中的日期时间对象方法C++问题
- 将对象方法从向量应用于C 的第二个向量中的对象
- 将 C++/CLI 对象指针传递给本机对象方法
- 多态性的面向对象方法
- 将对象方法传递到变量
- C :使用Main中定义的对象方法的函数
- 有关使用矢量迭代器访问对象方法的问题
- 定义可以执行对象方法和独立函数的函数时出现问题
- 调用列表中子对象方法的最佳方法
- main.cpp:(.text+0x8f):对[对象方法]的未定义引用
- cpp 从需要超类对象的函数访问子类对象方法