1. 程式人生 > >智慧指標在多執行緒情況下的問題

智慧指標在多執行緒情況下的問題

這兩天在測試一個程式的時候發現,一旦壓力達到一定程度,程式立即就會崩潰,報的錯誤幾乎都在new的時候沒有記憶體了,一開始以為確實是因為記憶體分配的問題,後來在程式執行過程中用top觀察,發現記憶體使用很低,因此可以確認不應該是瞬間記憶體使用完造成的。因此認真看了一下core dump的地方,發現幾乎都是在自己寫的一個智慧指標分配記憶體那裡出的問題。於是仔細思考了一下,發現是因為智慧指標的引用計數沒有加鎖導致的。

一開始以為我所使用的智慧指標即使是在非同步情況下使用的,但是基本上只能同一時間在一個執行緒持有,但是事實情況卻並非如此

如下程式碼

void func()

{

  shared_ptr a;

 async_call(a);

}

首先有一個智慧指標,接下來,這個智慧指標被丟給了非同步程式,因此這個時候其實已經有兩個執行緒同時持有這個智慧指標了,因為這個函式還未退出,當前執行緒還擁有臨時變數a。一般低壓情況下,這兩句很快就執行完了,不會出問題,但是高壓情況下,這個函式先執行完,還是非同步程式先執行完就不一定了(或者說是因為高壓情況樣本變多了)

結論:多執行緒非同步程式的衝突問題比一般性多執行緒程式更隱蔽,很難查詢,要仔細思考。

相關推薦

智慧指標執行情況的問題

這兩天在測試一個程式的時候發現,一旦壓力達到一定程度,程式立即就會崩潰,報的錯誤幾乎都在new的時候沒有記憶體了,一開始以為確實是因為記憶體分配的問題,後來在程式執行過程中用top觀察,發現記憶體使用很低,因此可以確認不應該是瞬間記憶體使用完造成的。因此認真看了一下core

關於在執行情況同步爬蟲爬取結果的一個例子

這些天一直在用java做爬蟲工作,之前遇到的都比較簡單,大多都是單介面的爬取,這次需要爬蟲100多個介面,肯定得多跑幾個執行緒 然而這些介面由於資訊中有重複,leader要求我們必須去重,因為資料庫更改是有次數限制的。所以搞了幾天,才把這個程式寫出來。 先寫一下思想:首先,利用JA

設計模式之單例模式(餓漢式+執行情況的懶漢式單例)

  今天所記錄的補上昨天未完成的設計模式之單例模式 餓漢式單例:    執行結果:    在編寫餓漢式單例時使用了final 關鍵字進行修飾所以不會出現多執行緒安全的情況產生。接下來我們完善一下昨天的懶漢式單例:   首先我們看一下昨天懶漢式單例的執行圖:        發現

Map資料在執行 情況出現的問題

公司去年 就接入了  神策大資料分析,去年埋點一直問題不斷 修修補補,  一年的續費快完了,大佬說 今年用完了 就不用了,沒什麼卵用,就是報表做的好看 .....去年在 做埋點的時候 遇到不少坑,今年 修復的時候也踩map的 坑是這樣的 .我們的埋點會向神策資料分析伺服器提交

執行情況慎用localtime_r

最近有個需求,需要提升日誌模組的效能。當前日誌模組每秒鐘處理的日誌數量大概在55w左右,於是進行優化,在日誌的IO執行緒中將sprintf剝離,提前將時間、日誌等級等格式化處理。 於是這樣就產生了一個問題,在IO執行緒中頻繁的使用localtime_r來獲取日期時間,在單執

執行情況,單例模式的實現方式

方式1(推薦)package singleton; public class Singletion { private static class InnerSingletion { priv

執行情況,主執行先退出,子執行會被強制退出嗎

1、程序中執行緒之間的關係 執行緒不像程序,一個程序中的執行緒之間是沒有父子之分的,都是平級關係。即執行緒都是一樣的, 退出了一個不會影響另外一個。 但是所謂的"主執行緒"main,其入口程式碼是類似這樣的方式呼叫main的:exit(main(...))。 main執行完

HashMap執行環境的死迴圈問題解釋

hashMap在多執行緒環境下,呼叫put方法出現的死迴圈是由於擴容時候resize方法導致的連結串列出現迴圈。 void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity =

基於Log4j NDC 執行條件記錄日誌,排查生產問題

在大吞吐,高併發的場景, 一個請求到達後端,通常是轉換成多執行緒並行處理請求, 如何通過一個標誌找到這個請求對應的多個執行緒,瞭解這個請求的完整的處理情況,從而幫助我們定位這次呼叫到底哪一步出現了問題,對我們快速定位排查生產問題是非常有用的。我們在每個子任務程式

java day25 執行) 單例類(Runtime,Timer

25.01_多執行緒(單例設計模式)(掌握) 單例設計模式:保證類在記憶體中只有一個物件。 如何保證類在記憶體中只有一個物件呢? (1)控制類的建立,不讓其他類來建立本類的物件。private (2)在本類中定義一個本類的物件。Singl

Java執行環境的懶漢模式解決方案

一、場景簡述 單例模式下有餓漢模式和懶漢模式,其中懶漢模式在於呼叫相關方法時例項才被建立。懶漢模式我們不難實現,但是在懶漢模式下我們如果使用多執行緒,就會取出多個例項的情況,與單例模式相違背,所以該篇部落格筆者主要關於在多執行緒環境下利用DCL雙檢查鎖機制來實現懶漢模式。

linux執行環境的搶屍行為(system返回-1:No child processes)

#!/usr/bin/env python #coding:utf8 import os import time pid = os.fork() if pid: print 'in parent.sleepin....' while True:

執行環境呼叫 HttpWebRequest 併發連線限制

.net 的 HttpWebRequest 或者 WebClient 在多執行緒情況下存在併發連線限制,這個限制在桌面作業系統如 windows xp , windows  7 下預設是2,在伺服器作業系統上預設為10. 如果不修改這個併發連線限制,那麼客戶端同時可以建立的

執行環境的ConcurrentHashMap

文章目錄 什麼是ConcurrentHashMap? 底層資料結構? 如何實現併發安全? transfer和ForwardingNode Hash計算 什麼是ConcurrentHashMap? C

執行環境使用log4j輸出各執行的標識,區分各執行輸出的內容

在多執行緒環境下,我們可能需要輸出很多資訊,每個執行緒產生的日誌資訊可能都是類似的,我們如何區分出哪些資訊是同一個執行緒輸出的呢?其實log4j已經提供了多種實現方式: 1.使用PatternLayout,在設定輸出格式的時候增加%t引數,這樣會輸出各個執行緒的執行緒名稱,這樣我們就可以根據執行緒名稱區分哪

從專案中談JAVA中static 方法在執行環境的運用

最近在做一個實時性比較高的系統,資料庫訪問很頻繁。在這個專案中資料庫訪問的大多數都被我做成了static 方法。(這樣做應該不是很好,沒辦法發揮dao模式的優勢,不過湊合用吧)因這個系統是多執行緒。static方法的運用需要注意,不能在servlet中使用成員變數,因為如果你

執行併發的單例模式實現

1.1 天生執行緒安全的餓漢式單例 1.2 懶漢式單例 1.2.1 執行緒不安全的懶漢式單例 1.2.2 執行緒安全的懶漢式單例

執行狀態使用同步機制的本質原因

簡述 在Java的學習中必然會遇到多執行緒和同步問題,對於初學者一般只會理解到相關api的使用,但是很少能夠真正知道為什麼要對多執行緒環境下的物件進行同步,接下來我就談談自己的一些理解。 JVM堆與JVM棧巨集觀室是分離的,而微觀上則又相互聯絡,這種分配方式使得JVM堆中的

執行場景如何使用 ArrayList

ArrayList 不是執行緒安全的,這點很多人都知道,但是執行緒不安全的原因及表現,怎麼在多執行緒情況下使用ArrayList,可能不是很清楚,這裡總結一下。 1. 原始碼分析 檢視 ArrayList 的 add 操作原始碼如下: /** * Appends the spe

c++使用智慧指標執行安全佇列

整理自C++併發程式設計實戰使用std::shared_ptr<>的執行緒安全佇列/* * threadsafe_queue_ptr.cpp * * Created on: Mar 2, 2018 * Author: [email p