【问题标题】:C++11 Threads - start infinite worker thread from inside a classC++11 线程 - 从类内部启动无限工作线程
【发布时间】:2014-08-18 18:15:03
【问题描述】:

我想提供一个类,它在读取某些数据(udp 数据包或从文件)时保存一个缓冲区。如果我从主线程开始,一切都很好,但在这种情况下,我想避免用户必须为自己设置一个新线程。

所以我的代码尽可能简单:

class DataCollector
{
    void startCollect()
    {
        std::thread t1(readSource);
    }

    bool readSource()
    {
        while(1)
        {
            // read some data for storage
        }
    }   
}

int main()
{
    DataCollector myDataCollector;
    myDataCollector.startCollect();

    while(1)
    {
        // do some other work, for example interpret the data
    }

    return 0;
}

现在我需要你的帮助。如何在 startCollect 中调用这个线程?

编辑1: 这是我现在如何工作的示例!

// ringbuffertest.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <thread>
#include <Windows.h>

class DataCollector
{
private:
    //std::thread collecterThread;

public:
    DataCollector(){}

    void startCollect()
    {       
        readSource();
    }

    bool readSource()
    {
        while (1)
        {
            printf("Hello from readSource!\n");
            Sleep(1000);
        }
        return false;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    DataCollector myDataCollector;

    std::thread t1(&DataCollector::startCollect, std::ref(myDataCollector));

    t1.join();
    return 0;
}

但正如我所说,我想将线程调用隐藏在我的 startCollect 函数中。

【问题讨论】:

  • 线程不应该是DataCollector的属性吗?然后你可以在构造函数中实例化它并在 startCollect 中启动它。
  • 您将需要一个(或两个)缓冲区并使用 condition_variable 通知每个线程已经提供了一些数据。
  • 是的,我知道我的缓冲区。我只是把我的程序中的所有东西都扔掉了,以使其尽可能简单。

标签: c++ multithreading class infinite


【解决方案1】:

在销毁活动的thread 对象之前,它必须加入(等待线程完成,然后清理其资源)或分离(留给完成后运行并自行清理)。

所以你可以让线程成为成员变量,以便以后可以加入:

void startCollect()
{
    this->thread = std::thread(&DataCollector::readSource, this);
}

void waitForCollectToFinish()
{
    this->thread.join();
}

或者你可以分离它,如果你不需要等待它完成的能力,并且有一些其他的方式来表示数据可用:

void startCollect()
{
    std::thread([this]{readSource();}).detach();
}

您还可以查看更高级别的并发工具,例如 std::asyncstd::future。这些可能比直接处理线程更方便。

【讨论】:

  • 你可以在coliru上看到这个方法。
  • this->thread = std::thread(readSource, this);让我编译器错误。我将编辑一个工作示例(我从 main 启动线程)。
  • @user3783662:你说得对,应该是&amp;DataCollection::readSource。或者,也许更易读,lambda [this]{readSource();}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多