1. 程式人生 > >.net 4.0新特性-自旋鎖(SpinLock)

.net 4.0新特性-自旋鎖(SpinLock)

概念:

msdn程式碼示例
比較了兩種鎖的效率
先用Monitor再決定是否用SpinLock

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

class SpinLockDemo2
{
    const int N = 100000;
    static Queue<Data> _queue = new Queue<Data>();
    static object 
_lock = new Object(); static SpinLock _spinlock = new SpinLock(); class Data { public string Name { get; set; } public double Number { get; set; } } static void Main(string[] args) { // First use a standard lock for comparison purposes. UseLock(); _queue.Clear(); UseSpinLock(); Console
.WriteLine("Press a key"); Console.ReadKey(); } private static void UpdateWithSpinLock(Data d, int i) { bool lockTaken = false; try { _spinlock.Enter(ref lockTaken); _queue.Enqueue(d); } finally { if
(lockTaken) _spinlock.Exit(false); } } private static void UseSpinLock() { Stopwatch sw = Stopwatch.StartNew(); Parallel.Invoke( () => { for (int i = 0; i < N; i++) { UpdateWithSpinLock(new Data() { Name = i.ToString(), Number = i }, i); } }, () => { for (int i = 0; i < N; i++) { UpdateWithSpinLock(new Data() { Name = i.ToString(), Number = i }, i); } } ); sw.Stop(); Console.WriteLine("elapsed ms with spinlock: {0}", sw.ElapsedMilliseconds); } static void UpdateWithLock(Data d, int i) { lock (_lock) { _queue.Enqueue(d); } } private static void UseLock() { Stopwatch sw = Stopwatch.StartNew(); Parallel.Invoke( () => { for (int i = 0; i < N; i++) { UpdateWithLock(new Data() { Name = i.ToString(), Number = i }, i); } }, () => { for (int i = 0; i < N; i++) { UpdateWithLock(new Data() { Name = i.ToString(), Number = i }, i); } } ); sw.Stop(); Console.WriteLine("elapsed ms with lock: {0}", sw.ElapsedMilliseconds); } }

輸出
在短時間佔用資源的情況下,差別很大
image

相關推薦

.net 4.0特性-(SpinLock)

概念: msdn程式碼示例比較了兩種鎖的效率先用Monitor再決定是否用SpinLockusing System; using System.Collections.Generic; using System.Diagnostics; using System

-SpinLock(.NET 4.0+)

參考:https://www.cnblogs.com/1zhk/p/5269722.html  和 https://www.cnblogs.com/chenwolong/archive/2017/05/18/6872672.html Parallel.ForEach 和 ForEach

ASP.NET MVC 3.04.0 特性

Razor檢視引擎;NuGet包管理工具;改善的可擴充套件性;全域性活動篩選器(Global Action Filter); 動態語言支援;區域性頁面輸出快取;改進的ajax;改善的驗證機制;移動專案開發模板;Web API; 來自:http://blog.csdn.ne

C#4.0特性之協變與逆變實例分析

alt out thumb def 3.0 介紹 ted 路徑 運行 本文實例講述了C#4.0新特性的協變與逆變,有助於大家進一步掌握C#4.0程序設計。具體分析如下: 一、C#3.0以前的協變與逆變 如果你是第一次聽說這個兩個詞,別擔心,他們其實很常見。C#4.0中

OpenCV 4.0特性合集

Summary:一文讀懂OpenCV 4.0 所有新特性 Author:Amusi Date:2018-11-28 微信公眾號:CVer github:https://github.com/amusi 知乎專欄:https://zhuanlan.zh

OpenCV 4.0 特性

OpenCV 4.0 2018.11.20 在釋出3.0版的近3.5年後,我們很高興推出4.x系列的第一個穩定版本。 版本特性: OpenCV現在是C ++ 11庫,需要相容C++ 11標準的編譯器。所需的最低CMake版本已提升至3.5.1。 很多OpenCV 1.x的

C# 4.0 特性之命名引數和可選引數, 動態繫結(dynamic), 泛型協變和逆變, CountdownEvent, Barrier

/* * CountdownEvent - 執行緒、任務同步類。執行緒或任務一直阻塞到 CountdownEvent 的計數為 0 為止 * 1、當有新的需要同步的執行緒或任務產生時,就呼叫 AddCount 增加 CountdownEvent 的計數 * 2、當有執行緒或任務到達同步點時,就呼叫 Signa

C# 4.0特性(白皮書)[轉]

Contents 目錄 Introduction 簡介 C# 4.0 Dynamic Lookup 動態查詢 The dynamic type dynamic型別 Dynamic operations 動態操作 Runtime lookup 執行時查詢 Exam

php5.4.0特性,trait的優先順序分析

結論:同樣的方法名,當前類的trait,比繼承過來方法,優先順序高。比當前類裡的方法優先順序低。 實踐過程如下(省略靜態方法的實踐) 實踐程式碼1: trait trait1{ pub

C#4.0 特性 動態型別Dynamic

        本文主要旨在與網友分享.Net4.0的Dynamic 對Duck Type 的支援。     一、.net4.0主要新特性         .Net4.0在.Net3.5基礎上新增的主要特性有:可選引數、命名引數和Dynamic。具體請閱生魚片的這篇博文。這裡我們著重講解C#4.0的Dyn

RocketMQ4.4.0特性分享

放棄 函數 繼續 default ren lint 刪除 持續時間 最新 rocketmq1、架構   MQ歷史   由數據結構隊列發展而來   MQ使用場景   異步處理   解耦   削峰填谷   數據同步2、隊列3、使用   生產   同步(sync)

Apache Cassandra 4.0特性介紹

引言 大家好,我是蔡一凡,是Cassandra的貢獻者之一。(雖然我不便透露我的公司名稱),但目前我們公司Cassandra的部署是全世界最大的之一,Cassandra在我們公司也有很多的應用。 Cassandra是一個擁有high-scalability(高伸縮性)、high-availability(

c++執行緒併發:mutex,atomic,spinlock,單執行緒

自旋鎖直接呼叫了boost庫的#include <boost/smart_ptr/detail/spinlock.hpp> 測試執行緒併發的情況下耗時,不太明白為什麼boost的spinl

spinlock剖析與改進

1, spinlock介紹   spinlock又稱自旋鎖,執行緒通過busy-wait-loop的方式來獲取鎖,任時刻只有一個執行緒能夠獲得鎖,其他執行緒忙等待直到獲得鎖。spinlock在多處理器多執行緒環境的場景中有很廣泛的使用,一般要求使用spinlock的臨界

spinlock剖析

 1, spinlock介紹   spinlock又稱自旋鎖,執行緒通過busy-wait-loop的方式來獲取鎖,任時刻只有一個執行緒能夠獲得鎖,其他執行緒忙等待直到獲得鎖。spinlock在多處理器多執行緒環境的場景中有很廣泛的使用,一般要求使用spinlock的臨

關於spinlock的一些理解

    這裡並不是講spinlock的一般用法,只是提出自己曾經的一些疑問點,也給出自己的解答。     在《LINUX核心設計與實現》《LINUX裝置驅動程式》裡都提過,在非搶佔式的單處理器系統上的自旋鎖被優化為不做任何事情。我最初的疑問是即使是單處理器,沒有搶佔能力,但

linux驅動之(spinlock)

    自旋鎖是類似於訊號量的,同樣是對裝置的訪問進行干預,自旋鎖是一個互斥的,只能是上鎖後設備不可用,解鎖後可用。當某一個裝置被自旋鎖鎖定時,其他的程序需要訪問裝置時會進入一個忙迴圈的等待狀態,知道裝置的自旋鎖釋放後方可對裝置進行訪問。     在自旋鎖鎖住裝置進行操作時

.net 4.0 中對多執行緒特性(一)

      在.net 40中對多執行緒的處理增加了很多新的類以方便多執行緒環境下的程式設計實現,首先需要了解的是兩個非常有用的類Lazy<T>和ThreadLazy<T>,通過這兩個類我們可以很方便實現一個單例模式而不用考慮太多的執行緒安全的問題。

如何在Elastix 4.0 中新增定義模組

Elastix 於2016年被3CX收購,整個開源專案也因此完全停止,不再提供開源免費的Elastix系統的支援和下載; 為了保持這個開源專案的進行,社群成員又重新打包了Elastix,搖身一變成為Issabel;因此可以下載Issable作為自己的PBX系統;這些資料庫中儲

(一)Unity5.0特性------轉載官方-unity5.0正式釋出了,看看帶來哪些重要的特性

Added "-force-gl-ref" cmd-line option support for the OSX Editor.Added link to editor settings when sprite packer is disabledAnimation Window refreshed whe