2014-06-27 43 views
2

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

所以这里是我的代码那样简单我可以使它:

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函数内的线程调用。

+2

线程不应该是DataCollector的属性吗?然后你可以在构造函数中实例化它并在startCollect中启动它。 –

+0

您将需要一个缓冲区(或两个)并使用condition_variable通知每个线程已提供一些数据。 –

+0

你我知道我的缓冲区。我只是从我的程序中扔出一切,使其尽可能简单。 –

回答

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。这些可能比直接处理线程更方便。

+0

您可以在[coliru]上看到此方法(http://coliru.stacked-crooked.com/a/87b6ee616f912cd9)。 –

+0

this-> thread = std :: thread(readSource,this);我得到编译器错误。我将编辑一个工作示例(其中我从main开始线程)。 –

+0

@ user3783662:你说得对,应该是'&DataCollection :: readSource'。或者,也许更具可读性,lambda'[this] {readSource();}'。 –