C++类方法线程

标签 c++ multithreading oop methods

<分区>

我有一个类有一个方法需要连续运行但也能够接收来自用户的输入。所以我想我会使用线程单独运行该方法。

代码看起来像这样(只是主干):

class SystemManager
{
private:
    int command;
    bool commandAcK;

    bool running;

    //other vars

public:

    SystemManager()
    {
        //initialisation
    }

    void runningAlgorithm()
    {

        while (running)
        {
            if (commandAcK)
            {
                //solve command
            }

            //run algorithm
            //print results
        }

    }


    void readCmd()
    {

        cin >> command;
        commandAcK = true;

    }



};




int main()
{

    SystemManager *SM = new SystemManager;

    thread tRunning = SM->runningAlgorithm();


}

现在错误看起来像这样:

不存在从“void”转换为“std::thread”的合适的构造函数

Error C2440 'initializing': cannot convert from 'void' to 'std::thread'

我找到了一个新方法,它没有给我任何错误

std::thread tRunning(&SystemManager::runningAlgorithm, SystemManager());    

我不明白的第一件事是这个方法不使用类的实例,只是使用通用函数。我如何将它链接到特定实例?我需要它以便它可以读取变量的值。

其次SystemManager前面的"&"是做什么的?

(&SystemManager::runningAlgorithm)

第三,有更好的方法吗?你有什么想法吗?

提前谢谢你。

最佳答案

std::thread tRunning(&SystemManager::runningAlgorithm, SystemManager()); 确实使用了您的类的一个实例。它使用的实例是 SystemManager(),它是一个临时的并且只对线程可用。如果您需要共享实例,那么您需要自己创建一个并通过引用传递给线程,例如

SystemManager sys_manager;
std::thread tRunning([&](){sys_manager.runningAlgorithm();});

现在您的调用站点和您的线程具有相同的实例。

另请注意,commandcommandAck 需要通过某种同步来保护,因为您可以在读取时写入它们,从而导致 data race随后 undefined behavior .使用std::atmoic应该适合你。

关于C++类方法线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39390593/

相关文章:

c++ - 普通对象和临时创建的对象传递的普通参数、引用参数和const引用参数的区别

c++ - 通过清理杀死子进程

c++ - 如果现在不修改传递的对象,但可以稍后修改,我应该使用 const

java - 重写私有(private)方法

c++ - 在C++中接受多个字符串作为输入

java - 交叉同步块(synchronized block)

java - Java 中使用可杀死线程的多处理

Java 锁和条件

oop - 为什么我似乎无法掌握界面?

javascript - 如何构造一个 javascript 类以同时使用多个子方法?