如何產生一個C++區域性靜態物件的多執行緒問題
本來是想重現以前工作中遇到的一個Segment Fault。但是據說原來的問題已經在新的C++版本中解決了,現在不會產生段錯誤。而且C++的實現版本眾多,也無從考究原來的版本是哪一個了。
原來的程式碼模型如下,在多執行緒環境中,重複進入這個函式,可能會有多個建構函式同時執行。從而會產生段錯誤。當然這個概率比較小,好像在效能比較差的機器上較容易重現。
void func()
{
static string crash("It is none of my business!");
}
但這類問題現在仍然有效。可以參考《Effective C++(第三版)》中的條款4:確定物件被使用前已先被初始化。其中講到,任何一種non-const static物件,不論它是local或non-local,在多執行緒環境下“等待某事發生”都會有麻煩。
參考以下程式碼:
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
static string x(10000000, 'e');
if (x.length() == 0) {
cout << "Oh!" << endl;
}
else {
cout << x.length() << endl;
}
return 0;
}
int main()
{
CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
Sleep(100);
return 0;
}
在我的Visual Studio 2013 Express中的執行結果為:
Oh!
10000000
請按任意鍵繼續. . .
為了穩定重現這個問題,這裡使用了string(num,char)這個建構函式,好讓子彈飛得久一點。從結果看,確實有麻煩,當第二個執行緒訪問字串的時候,第一個執行緒還沒有把那個靜態字串初始化完成。所以不管是否利用了什麼Copy-On-Write或引用計數的技術與否,此時字串的長度為0,使用的時候可能會出現問題。
相關文章
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- python中多執行緒消費者生產者問題Python執行緒
- 多執行緒的安全性問題(三)執行緒
- 理解靜態區域性變數(static)在程式中的執行規則變數
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- 40 個 Java 多執行緒問題總結Java執行緒
- 多個執行緒順序列印問題,一網打盡執行緒
- 如何解決多執行緒併發問題執行緒
- c++多執行緒C++執行緒
- C++ 多執行緒C++執行緒
- 有個關於多執行緒的識別問題執行緒
- Java多執行緒程式設計(同步、死鎖、生產消費者問題)Java執行緒程式設計
- 多執行緒問題解釋執行緒
- 多執行緒相關問題執行緒
- Java中一個物件在多執行緒中是共享的Java物件執行緒
- Java多執行緒-執行緒狀態Java執行緒
- 子執行緒使用父執行緒RequestScope作用域Bean問題的探究執行緒Bean
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- 多執行緒引起的效能問題分析執行緒
- Java多執行緒面試高配問題---多執行緒(3)🧵Java執行緒面試
- C++多執行緒:atomicC++執行緒
- C#多執行緒學習(二) 如何操縱一個執行緒C#執行緒
- java多執行緒之消費生產模型Java執行緒模型
- 多執行緒之8鎖問題執行緒
- 05.java多執行緒問題Java執行緒
- 靜態變數在多執行緒環境下的初始化是執行緒安全的嗎?變數執行緒
- 如何在多區域執行Zookeeper?- Ankur
- 多執行緒的三種實現方式及靜態代理模式執行緒模式
- 企圖使用c++執行緒解決nodejs單執行緒問題C++執行緒NodeJS
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- Spring中多執行緒的使用及問題Spring執行緒
- 程式與執行緒的產生執行緒
- 從一次生產消費者的bug看看執行緒池如何增加執行緒執行緒
- Java多執行緒:資料一致性問題及解決方案Java執行緒
- 多執行緒的執行緒狀態及相關操作執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC