如何在一个类中执行 C++ 多线程(将线程引用保持为成员 var)

Posted

技术标签:

【中文标题】如何在一个类中执行 C++ 多线程(将线程引用保持为成员 var)【英文标题】:How to do c++ multithreading in a class (keep thread ref as member var) 【发布时间】:2017-11-07 15:22:47 【问题描述】:

所以我正在尝试在 C++ 中做一些多线程,我正在尝试使用 std::thread。我可以在互联网上找到的所有示例都使用 main 方法。但是我想在类构造函数中创建一个线程,并在析构函数中加入线程,然后清理线程。我已经尝试了几件这样的事情:

.cpp:

#inlcude "iostream"
myClass::myClass()

    myThread= new std::thread(threadStartup, 0);


myClass::~myClass()

    myThread->join();
    delete myThread;


void threadStartup(int threadid) 

    std::cout << "Thread ID: " << threadid << std::endl;


.h

#pragma once
#include "thread"
class myClass 

public: 
    myClass();
    ~myClass();
private:
    std::thread* myThread;
;

这给了我以下错误错误:C2065: 'threadStartup': undeclared identifier。我也尝试将线程启动方法添加到类中,但这给了我更多错误。

我想不通,任何帮助将不胜感激。

编辑:std::thread 已更改为 std::thread*,就像在我的代码中一样。 如果我将 threadStartup 的函数声明移动到文件顶部,我会收到错误消息:

Severity    Code    Description Project File    Line    Suppression State
Error   C2672   'std::invoke': no matching overloaded function found

Severity    Code    Description Project File    Line    Suppression State
Error   C2893   Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'   

【问题讨论】:

要么在myClass::myClass() 之前插入threadStartup() 的原型,要么只是将整个函数向上移动。 刚刚尝试过,给了我更多错误,如我的编辑中所述:(。感谢您的快速回复。 如果您希望threadStartup 成为该类的一部分,请将其设为static,否则,只需修复@Scheff 提到的声明顺序即可。如果在那之后您遇到其他错误,请更新您的问题 - 它们可能与您发布的 sn-p 无关。 【参考方案1】:

无法复制。请看我的示例代码test-thread.cc:

#include <iostream>
#include <thread>

class MyClass 
  private:
    std::thread myThread;
  public:
    MyClass();
    ~MyClass();
;

void threadStartup(int threadid)

  std::cout << "Thread ID: " << threadid << std::endl;


MyClass::MyClass():
  myThread(&threadStartup, 0)
 

MyClass::~MyClass()

  myThread.join();


int main()

  MyClass myClass;
  return 0;

在 Windows 10(64 位)的 cygwin64 中测试:

$ g++ --version
g++ (GCC) 5.4.0

$ g++ -std=c++11 -o test-thread test-thread.cc 

$ ./test-thread
Thread ID: 0

$

请注意,我不使用new(因为在这种情况下没有必要)。

【讨论】:

我现在可以使用它了,谢谢。在我将函数向上移动后,我忘记读取我为测试目的而删除的参数。【参考方案2】:

C++ 是自上而下解析的,因为你的 threadStartup 函数是在你使用后声明的,编译器找不到它。在使用前声明 threadStartup 应该没问题。

【讨论】:

以上是关于如何在一个类中执行 C++ 多线程(将线程引用保持为成员 var)的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程3:Thread类中的静态方法

将互斥保护构建到 C++ 类中的线程安全方法?

Java多线程3:Thread中的静态方法

Java多线程Socket的关闭问题

如何将类中的函数放入线程中? (使用 Boost 的 C++)

ThreadLocal学习笔记