前幾天在業務代碼當中使用了C++11的future,在Windows 10的幾臺測驗機當中完全正常,一點問題都沒有。
結果到了客戶機器上,發現根本不能用。代碼大致如下:
class SysMisc
{
static BOOL GetScreenShotLQ()
{
auto InitFx=[&]()->ULONG{/*...*/};
auto fInit=async(InitFx);
fInit.get();//由于執行緒根本沒執行,堵塞。
}
};
呼叫的函式大概是這樣
class streamControl {
static BOOL ProcessFunction()
{
auto fSc=async(&SysMisc::GetScreenShotLQ);//不會執行,只會分配future<BOOL>的記憶體
// ....
fSc.get();//堵塞
}
};
以上全部async都不會執行,在Windows 10和Server 2016下完全正常,但是在使用XP、08R2的虛擬機或者物體物理機都出現了問題。
更換SDK無法解決,不管是64還是32位編譯,在08R2都有問題,XP是SDK7.1A,32位編譯。
很好奇究竟是哪里出現了問題,是MSVC的BUG還是XP、Server08R2的問題呢?
新手小白,還遇到了XP下socket永遠回傳-1的問題,暫時通過去除判斷解決。
圖片:

以上紅色劃線為Windows 10下一切正常(平板電腦、筆記本、一體機、臺式機等等數臺設備),但是虛擬機還是物體機的XP、08R2下都出現了問題。

以上問題相同/
還有就是,明明一個list的erase操作,是不可能出現問題的,但是偏偏在XP和08R2下出現了崩潰的情況,這個是運行庫、內核問題還是編譯器生成的代碼針對Win10做了優化?在10下是不會崩潰的,不管怎么樣erase都不會出現問題(迭代器每次erase以后指向list的begin),還有自己做的紅黑樹,擦除操作在Win10沒問題。
以上全部問題都是使用VS2017(15.8最新版),MSVC14.1的,這種是編譯器的BUG還是系統的問題?
uj5u.com熱心網友回復:
試試 匯編 級的 除錯uj5u.com熱心網友回復:
編譯器是不是應該要選擇那個帶有 XP 字樣的那個才行吧uj5u.com熱心網友回復:

vs 的list 很詭異。 版本不同 erase 不同,兩個vs驗證過。
關于執行緒,老機器運行失效,需要除錯才行。先把運行流程打log,關鍵引數也log,看運行哪里出現問題,
uj5u.com熱心網友回復:
出現問題指的是什么意思?運行不了?崩潰還是什么的?缺少相關的庫。uj5u.com熱心網友回復:
C++除錯想死,async是占了記憶體,但是函式一點都沒執行。。。然后get就阻塞了
uj5u.com熱心網友回復:
是除錯了,發現函式里面一點東西都沒執行,Win10一切正常,很靈異。
現在暫時自己實作了鏈表和紅黑二叉查找樹,懷疑送的標準庫有問題
uj5u.com熱心網友回復:
async無法執行函式體,沒有創建執行緒。list操作崩潰,在Win10一切正常,感覺是靈異事件
uj5u.com熱心網友回復:
能夠編譯到xp環境的vc, 根據我個人的經歷,vs2008是最后一個能完美支持的vc版本
而vs2017雖然標記有可以支持xp環境的選擇,但是實際我一次都沒成功過
估計你的問題也在那里
至于你是不是采用c++11的特性,其實這沒有多大關系
因為c++11編譯連接的時候會自動映射到本地代碼
所以出問題的還是你選擇的sdk版本太高,無法支持xp
不過,說實話,那么多年一直在用c++99,這樣的代碼windows linux unix通吃,也不怕vs版本更替,沒有必要使用c++11
uj5u.com熱心網友回復:
專案屬性下有個平臺選項,要選帶XP的才可以跑。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/62501.html
標籤:進程/線程/DLL
上一篇:WININET.DLL編程中的FTPOpenFile問題,用21埠可以,別的埠就打不開了
下一篇:VisualStudio C++/C#2015在除錯時如何在Watch視窗顯示WString,LPCWSTRd等UNICODE字串的值?
