c++ - 从类中运行线程

标签 c++ multithreading class runtime-error

我试图同时执行两个操作,一个是在程序的 main 方法中打印出 Tick from main 的循环,另一个是在一个类中打印出 Tick from ConnectionManager< 的循环.

我在这里运行的这段特定代码取自这里提出的一个问题。

main.cpp 文件:

#include <Windows.h> // printf, Sleep
#include <thread> // thread

// Include Connection Manager
#include "ConnectionManager.h"

int main() {
    ConnectionManager _CM;

    while (1) {
        printf("Tick from main");
        Sleep(1500);
    }
}

ConnectionManager.h

#pragma once
class ConnectionManager
{
private:
    void LoopForData();
public:
    ConnectionManager();
};

ConnectionManager.cpp

#include "ConnectionManager.h"

#pragma once
#include <Windows.h>
#include <thread>

void ConnectionManager::LoopForData() {
    while (1) {
        printf("Tick from connection manager\n");
        Sleep(1500);
    }
}

ConnectionManager::ConnectionManager()
{
    std::thread tobj(&ConnectionManager::LoopForData, this);
}

预期的行为是两个循环同时运行,但是我在控制台上获得的输出仅来自 LoopF​​orData 函数,并且我得到此错误屏幕:https://imgur.com/a/WO5AKE8

我可能遗漏了什么?

最佳答案

这应该可以正常工作。

#include <iostream>
#include <thread>
#include <chrono>

//ConnectionManager.h
class ConnectionManager
{
private:
    std::thread tobj;
public:

    ConnectionManager();
    ~ConnectionManager();
private:
    void LoopForData();
};
//ConnectionManager.cpp
#include "ConnectionManager.h"

void ConnectionManager::LoopForData(){
    while (1) {
        std::cout << "Tick from connection manager" << std::endl;
        std::this_thread::sleep_for (std::chrono::milliseconds(1500));
    }
}
ConnectionManager::~ConnectionManager(){
    if(tobj.joinable()){
        tobj.join();
    }
}
ConnectionManager::ConnectionManager() : tobj(&ConnectionManager::LoopForData, this){

}
//main.cpp

#include "ConnectionManager.h"
int main() {
    ConnectionManager _CM;

    while (1) {
        std::cout << "Tick from main" << std::endl;
        std::this_thread::sleep_for (std::chrono::seconds(1));
    }
}

我认为您的主要问题与当构造函数退出时 tobj 超出范围有关。您也可以使用 c++ 标准 sleep 而不是 Windows 中的 sleep 。

关于c++ - 从类中运行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56222370/

相关文章:

c++ - Boost date_time cpp 文件丢失

java - 何时更喜欢 LinkedBlockingQueue 而不是 ArrayBlockingQueue?

c++ Xcode 预期 '(' 用于函数样式转换或类型构造

java - 创建类存储对象

c++ - 自动创建未知数量的多个 C++ 对象

c++ - 递归地找到一条穿过迷宫的路径 C++

c++ - 为什么纯虚析构函数的实现必须为空?它应该是内联的吗?

java - 下面的代码不是线程安全的吗?

arrays - Swift 可变数组线程安全

python - 属性在对 FlaskView 的请求之间永远不会更新