0
我試圖從類成員函數創建一個胎面,並通過類構造函數初始化程序列表初始化所述線程。線程化類成員函數;線程初始化通過初始化列表
在調用Receive_List.push_back(CurVal++)
期間執行線程異常時,通過簡單地將printf()
作爲函數中的第一條指令,可以避免此異常。
#include <thread>
#include <list>
class SomeClass
{
std::thread Receive_Thread;
std::list<unsigned int> Receive_List;
void Receive_Main()
{
//printf("Hacky Way Of Avoiding The Exception\n");
const unsigned int MaxVal = 3000;
unsigned int CurVal = 0;
while (CurVal < MaxVal)
{
Receive_List.push_back(CurVal++);
}
}
public:
SomeClass() :
Receive_Thread(std::thread(&SomeClass::Receive_Main, this))
{}
~SomeClass()
{
Receive_Thread.join();
}
void ProcessReceiveList()
{
if (!Receive_List.empty())
{
printf("Received Val: %i\n", Receive_List.front());
Receive_List.pop_front();
}
}
bool IsReceiveEmpty()
{
return Receive_List.empty();
}
};
int main()
{
SomeClass* MyObject = new SomeClass();
//
// Sleep for 1 second to let the thread start populating the list
std::this_thread::sleep_for(std::chrono::seconds(1));
while (!MyObject->IsReceiveEmpty())
{
MyObject->ProcessReceiveList();
}
delete MyObject;
std::system("PAUSE");
return 0;
}
這是怎麼發生的?
這對我來說沒有意義,爲什麼取消註釋'printf()'允許代碼無例外地執行。我的印象是,簡單地使用list :: push和list :: pop函數可以同時運行,沒有問題。另外,將主線程中的while循環替換爲'while(true){}'仍然會導致異常。 – KKlouzal 2014-09-03 10:40:57
@KKlouzal:未定義的行爲往往沒有意義。不,標準容器不同步;你需要自己照顧自己。確實還有另外一個問題,我會在答案中加入。 – 2014-09-03 10:47:07
非常感謝您提供的所有信息。我不知道在類定義中聲明變量的順序表示它們被初始化的順序。 – KKlouzal 2014-09-03 10:51:38