代碼如下,主要問題是在start函式中。主要想實作的是封裝下std::thread,然后繼承自CThread的類實作run介面即可。
但目前的問題是,m_pThread = new std::thread(std::bind(&CThread::run, this));然后執行緒執行的時候,始終呼叫的是CThread中的run函式。比如下面的MyThread中的run函式始終呼叫不到。
像下面的測驗代碼
std::function<void()> testfunc = std::bind(&CThread::run, this);
testfunc();
就能呼叫到MyThread中的run函式。為什么交給std::thread就無法動態系結了?
這個該怎么解決??
class CThread
{
public:
CThread()
{
}
virtual ~CThread()
{
if (m_pThread)
{
if (m_pThread->joinable())
{
m_pThread->join();
}
delete m_pThread;
m_pThread = nullptr;
}
}
void start()
{
if (m_pThread)
{
return;
}
//m_pThread = new std::thread(&CThread::run, this);
m_pThread = new std::thread(std::bind(&CThread::run, this));
////--- test
std::function<void()> testfunc = std::bind(&CThread::run, this);
testfunc();
///
}
void waitForDone()
{
if (!m_pThread)
{
return;
}
if (m_pThread->joinable())
{
m_pThread->join();
}
}
void detachThread()
{
if (!m_pThread)
{
return;
}
if (m_pThread->joinable())
{
m_pThread->detach();
}
}
protected:
virtual void run()
{
std::cout << "CThread Is Running";
}
private:
std::thread *m_pThread{nullptr};
};
/// 實作CThread介面
class MyThread : public CThread
{
public:
protected:
virtual void run() override
{
std::cout << "MyThread Is Running.";
}
};
int main()
{
MyThread t;
t.start();
t.waitForDone();
}
uj5u.com熱心網友回復:
你用的什么編譯器?我在vs2015上跑結果輸出的是MyThread中的run,如果真有問題,可以添加一層間接呼叫解決:class CThread
{
public:
CThread()
{
}
virtual ~CThread()
{
if (m_pThread)
{
if (m_pThread->joinable())
{
m_pThread->join();
}
delete m_pThread;
m_pThread = nullptr;
}
}
void start()
{
if (m_pThread)
{
return;
}
m_pThread = new std::thread(&CThread::runWrapper, this);
}
void waitForDone()
{
if (!m_pThread)
{
return;
}
if (m_pThread->joinable())
{
m_pThread->join();
}
}
void detachThread()
{
if (!m_pThread)
{
return;
}
if (m_pThread->joinable())
{
m_pThread->detach();
}
}
protected:
virtual void run()
{
std::cout << "CThread Is Running";
}
private:
void runWrapper()
{
run();
}
private:
std::thread *m_pThread{ nullptr };
};
uj5u.com熱心網友回復:
我用的是Gcc 4.8.5,也試過加一層runWraper。
現在真正神奇的是,同一個代碼。多次運行,有時候輸出的CThread Is Running,有時候是MyThread Is Running。
uj5u.com熱心網友回復:
把gcc換成8.3還是一樣的。在VS2015下測驗,一直是MyThread Is Running。
懵了了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/279398.html
標籤:C++ 語言
上一篇:vs2019創建專案
