1. 並發和並行:一個好的並發演算法未必是一個好的並行演算法2. 並發編程的2個設計要點:安全和效能,在多CPU環境下還要考慮可擴充性3. 安全性: a. 最常見的方法是要求對象在任意時刻都應該滿足一致的狀態(不變約束) b. 在某些無阻塞演算法中,允許對象暫時處於不一致狀態,但是應該在運行中檢測並立刻修正它4. 影響安全的因素:原子性、可見度和指令順序5. 滿足安全性的基本策略: a. 通過對象的不可變性保證對象總是滿足不變約束:一個不變對象是安全執行緒的 a.
聲明:這篇文章關於記憶體模型的部分主要翻譯自Understand the Impact of Low-Lock Techniques in Multithreaded Apps,此外增加了無鎖編程(即Lock-Free)的內容,發布這篇文章的目的在於為以後描述.NET多線程並發/並行編程做底層基礎。理解記憶體模型對於多線程編程有著莫大的益處,尤其是對於Lock-Freedom。關於Lock-Free的優缺點,可以參考關於無鎖編程。具體的解釋可以參考《Java並發編程實踐》,《Intel
上一篇隨筆“"Loads are not reorderd with other loads" is a FACT!! 續:不要指望 volatile”中已經提到了。.NET的記憶體模型在volatile load上的實現是錯誤的。這在今天終於是半個官方的結論了。有關這個討論的結論可以參考“A bit more formalism as to why CLR's MM is broken on x86/x64
兩種實現方法如下:方法一:CREATE TABLE #tabTmp(id int) INSERT #tabTmp EXECUTE('SELECT id FROM '+@TableName) declare curOne cursor for SELECT id FROM #tabTmp open curOne FETCH NEXT from curOne into @ID方
這是使用動態Sql的人都會碰到這樣的問題,需要從動態執行的sql中傳回值,下面給一個簡單的實現例子。 IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME = 'ValueFromSql') DROP PROC ValueFromSqlGOcreate proc ValueFromSql as begindeclare @value varchar(100)exec sp_executesql N'select @value=''From Sql''