1. 程式人生 > >C#中的執行緒(二)執行緒同步基礎 (讀後感)

C#中的執行緒(二)執行緒同步基礎 (讀後感)

一、lock 確保只有一個執行緒訪問某個資源或某段程式碼。通俗的講就是多個執行緒操作相同的鎖物件,只能一個執行緒操作完畢,例外的執行緒才能繼續訪問鎖定資原始碼

如下程式碼:

1.修改鎖定物件 的屬性

RYAreaEmpPathWayVM areaEmpPathWayVM = instance.systemConfigDistributor.GetAreaEmpPathWayDetail(epcVM.TenantLayerCode, epcVM.epc_no);

  if (areaEmpPathWayVM != null)
  {
    //由於區域僱員運動軌跡物件是動態物件故而鎖定物件
     lock (areaEmpPathWayVM)
       {

                 //業務邏輯1:

                  #region 1、更新屬性:最近刷卡4G裝置號、最近進入區域的時間

                   areaEmpPathWayVM.recent_device4g_no = epcVM.ry_device4g_no;
                   areaEmpPathWayVM.recent_probe_time = epcVM.create_time;
                  #endregion
                 
                 //業務邏輯2

                  #region .更新屬性:第一次進入區域時間、最近刷卡4G裝置號、最近進入區域的時間、最近進入區域ID、上一次被刷卡讀頭地址、最近刷卡讀頭地址
                  areaEmpPathWayVM.first_In_time = epcVM.create_time;
                  areaEmpPathWayVM.last_in_area_id = last_uhfPath.area_id;
                  areaEmpPathWayVM.last_probe_time = ALUtils.CloneObj<DateTime>(areaEmpPathWayVM.recent_probe_time);
                                                        //////////////////////////////////////////////////////////////////////////////////
                  areaEmpPathWayVM.recent_device4g_no = epcVM.ry_device4g_no;
                  areaEmpPathWayVM.recent_probe_time = epcVM.create_time;
                  areaEmpPathWayVM.recent_in_area_id = epcVM.access_Area_ID;
                  areaEmpPathWayVM.recent_uhf_portaddress = epcVM.uhf_portaddress;
                 #endregion
        }
 }

2.讀取鎖定物件的屬性進行邏輯判斷

 RYAreaEmpPathWayVM tempRYAreaEmpPathWayVM = instance.systemConfigDistributor.GetAreaEmpPathWayDetail(alarmGenerateVM.org_layer_code, alarmGenerateVM.epc_no);
    if (tempRYAreaEmpPathWayVM != null)
    {
       lock (tempRYAreaEmpPathWayVM)
        {

            if (!tempRYAreaEmpPathWayVM.recent_probe_time.HasValue || !tempRYAreaEmpPathWayVM.first_In_time.HasValue)
               return false;
          //如果最新讀頭第一次進入區域的時間與告警引數中第一次進入區域時間不相同,則僱員發生折返,不處理,否則處理
           if (tempRYAreaEmpPathWayVM.first_In_time != alarmGenerateVM.create_time)
            return false;
             return true;
         }
      }

                                    

二、鎖定的資源如果已經刪除,需要二次判斷物件資源是否存在

如下程式碼:

1.刪除併發集合某個鍵值

ConcurrentDictionary<string, RyAreaInEmpVM> temp = instance.GetAreaInEmpMap(vm.org_layer_code, vm.area_id);
 if (temp != null)
 {
    RyAreaInEmpVM aieDeleteVM;
     temp.TryRemove(vm.ID, out aieDeleteVM);
}

2.如果多個執行緒訪問已經鎖定的資源會形成阻塞佇列,這樣當某個執行緒釋放鎖資源,還可以繼續訪問程式碼,但是實際已經被刪除(鍵值),

   所以二次加鎖判斷。

//查詢條件:租戶ID、區域ID、僱員ID 沒有區域在場人員資料,則不執行
var aieVM = instance.areaController.GetAreaInEmpDetailByEmpId(ryAreaExitEmpVM.org_layer_code, ryAreaExitEmpVM.area_id, ryAreaExitEmpVM.emp_id);
if (aieVM != null)
  {
   lock (aieVM)
    {
     aieVM = instance.areaController.GetAreaInEmpDetailByEmpId(ryAreaExitEmpVM.org_layer_code, ryAreaExitEmpVM.area_id, ryAreaExitEmpVM.emp_id);
     if (aieVM != null)
     {
        lock (aieVM)
        {
      
#region  1.區域告警消除
.......
#endregion
 #region 2.1 刪除離開區域僱員
.......
#endregion

} } }

相關推薦

C#執行執行同步基礎 讀後感

一、lock 確保只有一個執行緒訪問某個資源或某段程式碼。通俗的講就是多個執行緒操作相同的鎖物件,只能一個執行緒操作完畢,例外的執行緒才能繼續訪問鎖定資原始碼 如下程式碼: 1.修改鎖定物件 的屬性 RYAreaEmpPathWayVM areaEmpPathWayVM = instance.system

JUC執行間通訊

兩個執行緒,一個執行緒列印1-52,另一個列印字母A-Z列印順序為12A34B...5152Z, 要求用執行緒間通訊 1.syn

C++11併發學習之執行管理

1.啟動執行緒 (1)使用物件 “小試牛刀”中thread構造時傳入的是函式,還可以傳入物件。 #include <thread> #include <iostream>   void func() {     std::cout<<

linux下 c怎麼讓才能安全關閉執行

多執行緒退出有三種方式:(1)執行完成後隱式退出;(2)由執行緒本身顯示呼叫pthread_exit 函式退出;    pthread_exit (void * retval) ; (3)被其他執行緒用pthread_cance函式終止:    pthread_cance

挖一挖C#那些我們不經常使用的東西之系列4——GetHashCode,ExpandoObject

add 工具 通過 border 後期綁定 main image 代碼 不同 一:GetHashCode   從MSDN上能夠看到的解釋是:用作特定類型的哈希函數,也就是說不論什麽對象的實例都會有一個int32類型的HashCode。而且存放在FCL中的

C++兩個常用的控制語句格式的函式width和precision函式

width 語法: int width(); int width( int w ); 函式 width()返回當前的寬度。可選擇引數w用於設定寬度大小。寬度是指每一次輸

java執行學習(): 終止執行講解:Stop()方法(後附如何正確終止執行)

本章來學習Java的stop執行緒終止方法; 老規矩,先看原始碼: @Deprecated public final void stop() { SecurityManager var1 = System.getSecurityManager(); if (var1 != n

c#的值型別和引用型別 裝箱拆箱 好文

  一,c#中的值型別和引用型別      眾所周知在c#中有兩種基本型別,它們分別是值型別和引用型別;而每種型別都可以細分為如下型別:       什麼是值型別和引用型別 什麼是

C++應用程式獲得管理員許可權執行(圖示帶盾牌)

在vista以後的windows版本中,有些時候需要提升編譯後生成程式的許可權,即希望讓生成的程式以管理員身份執行。雖然在一般情況下,可以使用滑鼠右鍵選擇的方式來強行以管理員身份執行,但它並沒有遮蔽普通執行方式,而且普通人通常也不會使用右鍵選擇以管理員身份執行,所以必須在

C++換行符‘\n’和控制符‘endl’的區別cout和printf區別

1.顯示字串時,在字串中包含換行符,而不是在末尾加上endl,可以減少輸入量 2.如果生成一個空行,則兩種方法的輸入量相同,但對大多數人而言輸入endl更為方便 3.顯示引號括起來的字串通常使用換行符

C++的單例模式及按需釋放模型

四、多執行緒安全的通用單例類例項獲取器 例子工程的名稱是SingletonThreadSafeInstanceGetter。 剛開始寫本文時,本沒有想實現多執行緒版本,主觀上以為同通常的單例模式一樣,多個多執行緒同步就可以了,很簡單,讓讀者自己開發就好了,不過後來真正去思考

c++的編譯、連結和執行

1.編譯與連結的區別: 預處理:處理巨集定義指令#define 、標頭檔案#include等 #include<filename> ,尖括號表示系統提供的標頭檔案,直接去系統目錄查詢; #include“animal.h”,雙引號表示自己編寫的標頭檔案,

C#異常:“The type initializer to throw an exception型別初始值設定項引發異常”的簡單分析與解決方法

對於C#中異常:“The type initializer to throw an exception(型別初始值設定項引發異常)”的簡單分析,目前本人分析兩種情況,如下: 情況一: 其實麒麟.NET的這篇文章主要講解分析了靜態成員的方面,總的說就是:型別初始化或訪問

C#的類,子類,類的繼承待續

        所有的類的父類都是object類,也稱作基類,這個只做瞭解。關於父類與子類有以下幾點要注意:       1.子類繼承了父類中非私有的屬性和方法,子類也可以理解為派生類:      父類Father中定義了私有方法ZhengQian(),雖然子類Child繼

C++把函式作為引數並執行

#include<iostream> using namespace std; typedef int(*PFUN)(int a,int b); int add(int a,int b) { return a+b; } int fun(PFUN pf

執行學習執行執行Runnable與Callable

1、瞭解執行緒池幾個類之間的關係 (結合圖看後面的分析)       FutureTask  繼承 RunnableFuture , RunnableFuture 實現介面 Runnable 2、分析常用呼叫執行緒池程式碼(以下稱為程式碼A)

【LeetCode-面試算法經典-Java實現】【107-Binary Tree Level Order Traversal II叉樹層序遍歷II

lin -m length ret itl pub util 實現類 markdown 【107-Binary Tree Level Order Traversal II(二叉樹層序遍歷II)】 【LeetCode-面試算法經典-Java實現】【全

C#的函數() 有參有返回值的函數

lis function AD 編程 all bsp slist title 多余 接上一篇 C#中的函數(-) 無參無返回值的函數 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 這次研究下C#中的函數(二) 有參有返回值

UVA818-Cutting Chains進制枚舉+dfs判環

wing 情況 jewel dep join man follow tin pair Problem UVA818-Cutting Chains Accept:393 Submit:2087 Time Limit: 3000 mSec Problem Descript

一個線上音樂軟體的故事、其實故事從這裡才開始

其實故事從這裡才開始 如果你看到了這裡,那你應該看出來,我是在講軟體開發的故事,如果你和我一樣喜歡Linux,喜歡用Python那我希望你也喜歡這個故事。這個故事並不是講如何使用Python的,所以關於如何使用Python推薦你看《Python cookbook 第三版》