2016-02-26 16 views
0

我将如何找到一个向量元素从它的参数与emplace_back 试图分离线程然后从向量中删除它设置一个一个找到的矢量的元素。从它的参数

std::vector<std::thread> vTimerThreads; 
void SetTimer(UINT ID, DWORD dwMilliseconds) 
{ 
    // timerThreadProc is my thread that handles my timers 
    vTimerThreads.emplace_back(timerThreadProc, ID, dwMilliseconds); 
} 
void DeleteTimer(UINT ID) 
{ 
    //Find thread by ID? 
    // thread.detach(); 
    // then delete 
} 

SetTimer(TIMER1, 5000); 
+1

您尚未在任何地方存储“ID”,至少可以从矢量访问的任何位置。 – chris

回答

1

如果你想要做一个简单的线性搜索(这是有道理的,如果线程的数量并不大),你可以做

void DeleteTimer(UINT ID) 
{ 
    for(int i = 0; i < vTimerThreads.size(); i++) 
    if(vTimerThreads[i].get_id() == ID) 
    { 
     vTimerThreads.erase(vTimerThreads.begin()+i); 
     break; 
    } 
} 

如果你的线程数量很大,任意删除像这样很昂贵 - 在这种情况下,您可能需要考虑诸如forward_list而不是vector

+0

你刚刚重新实现了'std :: find_if'。 – chris

+0

是的,我不知道这个功能。谢谢你的提示。我会编辑答案。 –

+0

ID没有标准::螺纹:: get_id() – ramafe

3

std::find_if听起来像你想要什么,如果你只是要删除基于ID。

void DeleteTimer(std::thread::id ID) 
{ 
    std::vector<std::thread>::iterator itr = std::find_if(vTimerThreads.begin(), vTimerThreads.end(), [&](const std::thread& t) { return t.get_id() == ID; }); 
    if(itr != vTimerThreads.end()) 
     vTimerThreads.erase(itr); 
} 

我在这里使用了lambda表达式,但没有必要。

如果你想使用大量线程的,也许不同的数据结构会更适合你。你有没有考虑过std :: set来加快搜索速度?也许即使是地图或hash_map对你也有好处,其中id是关键?你可以把这些线程放到这些容器中,而不是使用emplace_back来移动语义而不用复制(因为我怀疑是在激励你使用emplace)。

时退房std::algorithm library虽然,有在那里

编辑一些伟大的东西: 我的意见,一见OP说,ID其实也不是线程ID。除非我们能够澄清我们打算搜索的std::vector<T>的T的哪个成员,否则不能提供明确的解决方案。

只要我做编辑,这里是添加线程一个std ::地图,而复制一些代码。使用下面的代码,通过std :: thread :: id或其他你想用作键的元素来找到一个元素是很简单的,然后删除它。

std::map<std::thread::id, std::thread> mapTimerThreads; 

void AddNewThreadToMap() 
{ 
    std::thread t; 
    mapTimerThreads[t.get_id()] = std::move(t); 
} 
+1

在擦除之前,您应该检查'itr!= vTimerThreads.end()'。 – Jarod42

+0

@ Jarod42哦,天哪,我不能相信我离开了那个。谢谢你接受!我已经编辑了那个答案。 –