我最近阅读了很多有关 C++ 的书籍,但有一件事没有出现。我最终找到了自己的解决方案,但我不确定它是否正确。所以我问是否有比这更好的方法。从我在 C++11 中读到的内容来看,启动一个线程是一项简单的工作,事实上我并没有发现它那么难。然后我尝试在黑暗中尝试提高我的知识,所以我决定“将类变成线程”(如果这有意义的话)。基本上我会有一个类会做自己的事情,不受主程序的影响。这里有一些代码可以指导您完成
SocketServer.h
#ifndef SOCKETSERVER_H
#define SOCKETSERVER_H
#include <string>
#include <boost\asio.hpp>
class SocketServer
{
public:
SocketServer(std::string ip_address, unsigned short port);
~SocketServer();
void Read();
//bool isValidIP(const char* ip_address);
private:
boost::asio::io_service io_service;
std::string listenIP;
unsigned short listenPort;
void BeginListen();
};
#endif;
每当我尝试时,现在在我的 main() 函数中
std::thread socketServerThread(SocketServer, listenIP, listenPort);
它总是在我的脸上爆炸。但是如果我有那个结构
void InitSocketServer(std::string listenIP, unsigned short listenPort)
{
SocketServer* c = new SocketServer(listenIP, listenPort);
}
然后我将其与参数一起放入线程构造函数中,它突然起作用了。就我个人而言,这是困惑的代码,我想知道是否有更好的方法来实现同样的目标。提前谢谢你
最佳答案
通常的解决方案是为对象提供一个完成实际工作的start
或run
方法。然后,您可以使用 new
创建一个新实例并生成一个线程来调用它的 start
或 run
方法。
不过,您必须牢记两个问题:
您要么需要
分离
线程,要么需要有人加入
它。如果您使用
new
分配实例,完成后需要有人删除
它。
如果需要,您可以使线程成为类的成员。只是不要尝试在构造函数中实际创建线程,因为在构造函数返回之前对象尚未完全构造。因此,如果您希望对象管理线程的生命周期,请在 start
或 run
方法中执行此操作。
关于C++11 线程 : Object with arguments in the constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869367/