Cấp bậc tác giả:

TRAINING

Làm việc với Thread Local Storage (TLS) trong C#

Được viết bởi QuangIT ngày 14/09/2012 lúc 04:57 PM
Thread-local storage (TLS) là một phương thức lập trình trên máy tính sử dụng bộ nhớ tĩnh hoặc địa phương(global) đến thread. Tất cả các giá trị của tiến trình chia sẻ không gian địa chỉ ảo của tiến trình này. Các biến địa phương của một chức năng duy nhất cho mỗi thread chạy chức năng này.
  • 0
  • 13580

Làm việc với Thread Local Storage (TLS) trong C#

Tóm Tắt

Thread-local storage (TLS) là một phương thức lập trình trên máy tính sử dụng bộ nhớ tĩnh hoặc địa phương(global) đến thread. Tất cả các giá trị của tiến trình chia sẻ không gian địa chỉ ảo của tiến trình này. Các biến địa phương của một chức năng duy nhất cho mỗi thread chạy chức năng này.


Tuy nhiên, các biến tĩnh và toàn cục được chia sẻ bởi tất cả các thread trong tiến trình này. Với Thread-local storage (TLS), bạn có thể cung cấp dữ liệu duy nhất cho mỗi tiến trình thread đó có thể truy cập bằng cách sử dụng một chỉ số toàn cục. Một trong những thread phân bổ các chỉ số, có thể được sử dụng bởi các thread khác để lấy dữ liệu duy nhất kết hợp với chỉ số.


Trong phiên bản NET Framework 4, bạn có thể sử dụng các lớp System.Threading ThreadLocal <T> để tạo ra các đối tượng thread-local.

System.Threading. ThreadLocal <T>

T Chỉ định các loại dữ liệu được lưu trữ cho mỗi thread. Tùy loại ThreadLocal (của T) cho thấy nhiều thành phần sau đây.

Xây dựng

•    ThreadLocal (T) – cấu trúc sử dụng để khởi tạo các (T) ThreadLocal.

•    ThreadLocal (T) (Tfunc (T)) – cấu trúc này được sử dụng để khởi tạo các ví dụ ThreadLocal (của T) với chức năng valueFactory được quy định.

Thuộc tính

•    Value thuộc tính này được sử dụng để có gán, hoặc thiết lập giá trị cho các Thread hiện tại.

•    IsValueCreated thuộc tính này được sử dụng để có một giá trị được khởi tạo trên các Thread hiện tại.

Phương thức

•    Dispose() - Phương thức này được sử dụng để release tất cả các resource được sử dụng bởi các lớp ThreadLocal (Of T).

•    Equals(Object) - Phương thức này xác định các đối tượng quy định bằng các đối tượng hiện tại. (Thừa kế từ đối tượng)

•    Finalize () - Phương thức này được dùng để giải phóng các nguồn lực được sử dụng bởi ThreadLocal (Of T). (Overrides Object.Finalize)

•    GetHashCode() - phương thức này phục vụ như hàm băm cho một loại cụ thể. (Thừa kế từ đối tượng)

•    GetType() - Phương thức này được gán cho các phiên bản hiện tại. (Thừa kế từ đối tượng)

•    MemberwiseClone() - Phương thức này được sử dụng để tạo ra một bản sao hời hợt của các đối tượng hiện tại. (Thừa kế từ đối tượng)

•    ToString () - Phương thức này được sử dụng để tạo ra và trả về một chuỗi đại diện của phiên bản này cho thread hiện tại. (Object.ToString Overrides)

.NET Framework cung cấp các khe cắm dữ liệu động là một sự kết hợp duy nhất của Thread và miền ứng dụng. Có hai loại khe cắm dữ liệu: khe cắm named và khe cắm unnamed. Cả hai đều được thực hiện bằng cách sử dụng cấu trúc LocalDataStoreSlot.

•    Để tạo ra một khe cắm dữ liệu named, sử dụng phương thức Thread.AllocateDataSlot hoặc Thread.GetNamedDataSlot. Để lấy một tham chiếu đến một khe cắm có tên là hiện tại, sử dụng phương thức GetNamedDataSlot.

•    Để tạo ra một khe cắm dữ liệu unnamed, sử dụng phương thức Thread.AllocateDataSlot

Đối với cả hai khe cắm named và unnamed, sử dụng phương thức Thread.SetData và Thread.GetData để thiết lập và lấy các thông tin trong khe. Đây là những phương thức tĩnh mà luôn hành động dựa trên các dữ liệu cho các Thread hiện đang thực hiện.

Khe cắm named có thể được thuận lợi, bởi vì bạn có thể lấy các khe cắm khi bạn cần nó bằng cách đi qua tên phương thức GetNamedDataSlot, thay vì duy trì một tham chiếu đến một khe cắm unnamed. Tuy nhiên, nếu một thành phần khác sử dụng cùng một tên cho lưu trữ thread-tương đối của nó và một thread thực thi mã từ cả hai thành phần của bạn và các thành phần khác, hai thành phần có thể bị mất dữ liệu. (Kịch bản này giả định rằng cả hai thành phần đang chạy trong cùng một miền ứng dụng, và rằng chúng không được thiết kế để chia sẻ cùng một dữ liệu.)

Ví dụ sau đây cho thấy làm thế nào để sử dụng ThreadLocal (T):



using System;using System.Threading;namespace ThreadLocalStorage
{
    class akshay    {
             public static void WriteError()
        {
            Console.WriteLine("Error number = " + Thread.GetData(Thread.GetNamedDataSlot("ErrNo")));
            Console.WriteLine("Error source = " + Thread.GetData(Thread.GetNamedDataSlot("ErrSource"))
        } 
        public static void SetError()
        {
            Random r = new Random();
            Thread.SetData(Thread.GetNamedDataSlot("ErrNo"), r.Next(100));
            Thread.SetData(Thread.GetNamedDataSlot("ErrSource"), Thread.CurrentThread.Name);
            WriteError();
        }
        public static void Main()
        {
            Thread.AllocateNamedDataSlot("ErrNo");
            Thread.AllocateNamedDataSlot("ErrSource");
            Thread th2 = new Thread(new ThreadStart(SetError));
            th2.Name = "t2";
            th2.Start();
            Thread th3 = new Thread(new ThreadStart(SetError));
            th3.Name = "t3";
            th3.Start();
            Thread.FreeNamedDataSlot("ErrNo");
            Thread.FreeNamedDataSlot("ErrSource");
            Console.Read();
        }
    }
}

Chúng ta có thể tạo Thread lưu trữ địa phương trong môi trường quản lý. Tùy thuộc vào ứng dụng của bạn, nó có thể là cần thiết cho bạn để có một lĩnh vực tĩnh của một lớp duy nhất cho mỗi Thread là lớp được sử dụng. Làm như vậy là trivially dễ dàng trong phần lớn các trường hợp của C#. Nếu bạn có một trường tĩnh là chủ đề tương đối, chỉ cần tô điểm cho nó thuộc tính ThreadStaticAttribute. Trường này sẽ được khởi tạo cho mỗi Thread mà nó truy cập đến. Bao gồm, mỗi thread được đưa ra Thread của nó tương đối của vị trí để lưu các giá trị hoặc tham chiếu. Tuy nhiên, khi sử dụng các tham chiếu đến các đối tượng, hãy cẩn thận với những giả định của bạn về việc tạo dựng đối tượng. Các mã sau đây cho thấy một khó khăn cho việc tránh.

using System;
using
 System.Threading;namespace ThreadLocalStorage
{
public class TLS    {
        public TLS()
        {
            Console.WriteLine("Creating TLS Class");
        }
     }
 public class TLSFlied        {
            [ThreadStatic]
            public static TLS Tdata = new TLS();        
        }
  public class EntryPoint        {
            private static void ThreadFun()
            {
                Console.WriteLine("Thread {0} starting.....",Thread.CurrentThread.ManagedThreadId);
                Console.WriteLine("TData for this thread is \"{0}\"",TLSFlied.Tdata);
                Console.WriteLine("thread {0} exiting",Thread.CurrentThread.ManagedThreadId);
            }
            static void Main()
            {
                Thread t1 = new Thread(new ThreadStart(EntryPoint.ThreadFun));
                Thread t2 = new Thread(new ThreadStart(EntryPoint.ThreadFun));
                t1.Start();
                t2.Start();
                Console.Read();
            }
        }
}

Nguồn bài viết: Dngaz.com

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML