如何產生一個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執行緒變數
- 一個多執行緒的PushbackInputStream問題執行緒
- 多執行緒-執行緒安全問題的產生原因分析以及同步程式碼塊的方式解決執行緒安全問題執行緒
- 請教一個多執行緒的問題執行緒
- 關於多個執行緒同時呼叫單例模式的物件,該物件中方法的區域性變數是否會受多個執行緒的影響執行緒單例模式物件變數
- 多執行緒靜態方法同步執行緒
- 多執行緒-生產者消費者問題程式碼2並解決執行緒安全問題執行緒
- python中多執行緒消費者生產者問題Python執行緒
- 多執行緒-生產者消費者問題程式碼1執行緒
- 多執行緒的安全性問題(三)執行緒
- 多執行緒下聚合的一致性問題執行緒
- 請教一個多執行緒的問題--wait多個鎖執行緒AI
- 請教一個事務+多執行緒 的問題執行緒
- 多執行緒問題執行緒
- 執行緒區域性儲存(TLS)執行緒TLS
- Java靜態static工具類執行緒安全問題研究Java執行緒
- VC多執行緒 C++ 多執行緒執行緒C++
- java多執行緒執行問題Java執行緒
- 多執行緒鎖的問題執行緒
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- 關於Java多執行緒實現生產者和消費者的問題Java執行緒
- 理解靜態區域性變數(static)在程式中的執行規則變數
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- Java多執行緒程式設計(同步、死鎖、生產消費者問題)Java執行緒程式設計
- Java NIO 執行緒 的一個問題Java執行緒
- 利用C++多執行緒優化n王后問題C++執行緒優化
- 問一個守護執行緒問題?執行緒
- Java多執行緒3:Thread中的靜態方法Java執行緒thread
- 秒殺多執行緒面試題系列-如何使用多執行緒,詳細分析多執行緒的重點難點必考點——多執行緒同步互斥問題。各文章講解生動細緻,針對性強。必定也能助你在面試中秒殺所有多執行緒面試題...執行緒面試題
- Java多執行緒面試高配問題---多執行緒(3)🧵Java執行緒面試
- 40 個 Java 多執行緒問題總結Java執行緒
- 40個Java多執行緒問題總結Java執行緒
- 如何解決多執行緒併發問題執行緒
- java多執行緒之消費生產模型Java執行緒模型
- 多執行緒之生產者消費者執行緒
- 多個執行緒順序列印問題,一網打盡執行緒