我在我的類中宣告了一個指向執行緒的指標。
class A{
std::thread* m_pThread。
bool StartThread()。
UINT DisableThread()。
下面是我如何使用執行緒呼叫一個函式的方法。
bool A::StartThread()
{
bool mThreadSuccess = false;
{
try {
m_pThread= new std::thread(&A::DisableThread, this)。
mThreadSuccess = true;
}
catch (...) {
m_pDisable = false;
}
if(m_pThread)
{
m_pThread= nullptr;
}
}
return mThreadSuccess;
這里是我的執行緒所呼叫的函式。
UINT A::DisableThread()
{
//print something here.
return 0;
}
如果我呼叫這個StartThread()/code>函式10次。它會不會有記憶體泄漏?
for(i = 0; i<10; i ){
bool sResult = StartThread();
if (sResult) {
m_pAcceptStarted = true;
}
uj5u.com熱心網友回復:
釋放的正確方式是什么
m_pThread= new std::thread(&A::DisableThread, this)。
釋放使用分配new創建的非陣列物件的正確方法是使用delete。
避免裸擁有指標,避免不必要的動態分配。這個例子并沒有顯示出對動態存盤的需求,理想情況下你應該使用std::thread成員而不是指標。
如果我呼叫這個 StartThread() 函式 10 次。它是否會有記憶體泄漏?
即使是一次呼叫也會導致記憶體泄漏。泄漏發生在你扔掉這里的指標值時:
m_pThread= nullptr。
你能不能加入你的更好的解決方案
這里有一個:
auto future = std::async(std:: launch::async, & A::DisableThread, this) 。
//當另一個任務在另一個執行緒中執行時做一些事情。
do_something()。
//等待執行緒結束并獲得A::DisableThread回傳的值。
return future.get()
uj5u.com熱心網友回復:
我個人更傾向于在實際專案中使用執行緒池,但這個例子應該能讓你了解如何處理沒有new/delete的執行緒。
#include <iostream>
#include <thread>
#include <vector>
class A
{
public:
template<typename Fn>
void CallAsync(Fn fn)
{
//把執行緒放到向量中
m_threads.emplace_back(std::thread(fn)) 。
}
~A()
{
for (auto& thread : m_threads)
{
thread.join()。
}
}
void someHandler()
{
std::cout << "*"/span>;
};
private:
std::vector<std::thread> m_threads。
};
int main()
{
A a。
for (int i = 0; i < 10; i)
{
a.CallAsync([&a] { a.someHandler(); }) 。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333770.html
標籤:
