C++11 线程 : Object with arguments in the constructor

标签 c++ multithreading c++11

我最近阅读了很多有关 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);
}

然后我将其与参数一起放入线程构造函数中,它突然起作用了。就我个人而言,这是困惑的代码,我想知道是否有更好的方法来实现同样的目标。提前谢谢你

最佳答案

通常的解决方案是为对象提供一个完成实际工作的startrun 方法。然后,您可以使用 new 创建一个新实例并生成一个线程来调用它的 startrun 方法。

不过,您必须牢记两个问题:

  1. 您要么需要分离线程,要么需要有人加入它。

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

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

关于C++11 线程 : Object with arguments in the constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869367/

相关文章:

C++:如何在不进行舍入、截断或填充的情况下将 float 转换为字符串?

c# - C++ 到 C# 事件处理

java - 多线程服务器: one thread per client connection

c++ - 检测私有(private)成员的存在

c++ -/usr/bin/ld : cannot find -lgmock on ubuntu while running gmock program

c++ - 为什么 C++ 累积第三个参数类型导致编译失败

c++ - 是否可以检测 C++ 中的 namespace 成员身份?

c++ - 在 C++11 中有没有一种好方法可以将对其他对象的引用存储为成员?

ruby - Thread#run 和 Thread#wakeup 之间的区别

iphone - 后台线程在 iPhone 3GS 上消耗 100% CPU 导致潜在的主线程