0

我最近一直在阅读很多关于 C++ 的内容,但没有出现一件事。我最终找到了自己的解决方案,但我不确定它是否正确。所以我问是否有比这更好的方法。从我在 C++11 中读到的内容来看,启动一个线程是一项简单的工作,实际上我并没有发现它那么难。然后我试图在黑暗中提高我的知识,所以我决定“把类变成线程”(如果这有意义的话)。基本上我会有一个类,它会做自己的事情,不受主程序的影响。这是一些指导您完成的代码

套接字服务器.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);
}

我把它放在带有参数的线程构造函数中,它突然起作用了。对我个人而言,这是凌乱的代码,我想知道是否有更好的方法来实现同样的目标。先感谢您

4

1 回答 1

2

通常的解决方案是给对象一个startrun方法来完成真正的工作。然后,您可以创建一个新实例new并生成一个线程以在其上调用startorrun方法。

但是,您必须牢记两个问题:

  1. 你要么需要detach线程,要么有人需要join它。

  2. 如果您使用 分配实例new,则完成后有人需要delete它。

如果需要,您可以使线程成为该类的成员。只是不要尝试在构造函数中实际创建线程,因为在构造函数返回之前对象尚未完全构造。如果您希望对象管理线程的生命周期,请在startor方法中执行此操作。run

于 2013-04-08T00:14:01.010 回答