次の方法で共有


Thread.FreeNamedDataSlot メソッド

プロセス内のすべてのスレッドに関して、名前とスロットの関連付けを解除します。

Public Shared Sub FreeNamedDataSlot( _
   ByVal name As String _)
[C#]
public static void FreeNamedDataSlot(stringname);
[C++]
public: static void FreeNamedDataSlot(String* name);
[JScript]
public static function FreeNamedDataSlot(
   name : String);

パラメータ

  • name
    解放されるデータ スロットの名前。

解説

いずれかのスレッドが FreeNamedDataSlot を呼び出した後、別のスレッドが同じ名前で GetNamedDataSlot を呼び出すと、その名前と関連付けられた新しいスロットが割り当てられます。その後、いずれかのスレッドが GetNamedDataSlot を呼び出すと、この新しいスロットが返されます。ただし、以前の GetNamedDataSlot の呼び出しで返された System.LocalDataStoreSlot を持っているスレッドは、継続して古いスロットを使用できます。

名前と関連付けられているスロットは、 FreeNamedDataSlot の呼び出し前に取得された LocalDataStoreSlot がすべて解放され、ガベージ コレクションされたときにだけ解放されます。

スレッドは、ローカル ストア メモリ機構を使用して、スレッド固有のデータを格納します。共通言語ランタイムは、各プロセスの作成時に、そのプロセスにマルチスロットのデータ ストア配列を割り当てます。スレッドは、データ ストアのデータ スロットを割り当てたり、スロットにデータ値を格納および取得したり、スレッドの有効期限が切れた後でスロットを再利用できるようにスロットを解放したりできます。データ スロットはスレッドごとに一意です。他のスレッドは (子スレッドであっても) そのデータを取得できません。

使用例

[Visual Basic, C#, C++] 名前付きデータ スロットにスレッド固有の情報を格納する方法の例を次に示します。

 
Option Explicit
Option Strict

Imports System
Imports System.Threading

Class Test

    Shared Sub Main()
        Dim newThreads(3) As Thread
        For i As Integer = 0 To newThreads.Length - 1
            newThreads(i) = New Thread(AddressOf SlotExample.SlotTest)
            newThreads(i).Start()
        Next i
    End Sub
    
End Class

Public Class SlotExample

    Shared randomGenerator As Random = New Random()

    Shared Sub SlotTest()
    
        ' Set different data in each thread's data slot.
        Thread.SetData( _
            Thread.GetNamedDataSlot("Random"), _ 
            randomGenerator.Next(1, 200))

        ' Write the data from each thread's data slot.
        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", _
            AppDomain.GetCurrentThreadId().ToString(), _
            Thread.GetData( _
            Thread.GetNamedDataSlot("Random")).ToString())

        ' Allow other threads time to execute SetData to show
        ' that a thread's data slot is unique to the thread.
        Thread.Sleep(1000)

        Console.WriteLine("Data in thread_{0}'s data slot is still: {1,3}", _
            AppDomain.GetCurrentThreadId().ToString(), _
            Thread.GetData( _
            Thread.GetNamedDataSlot("Random")).ToString())

        ' Allow time for other threads to show their data,
        ' then demonstrate that any code a thread executes
        ' has access to the thread's named data slot.        
        Thread.Sleep(1000)

        Dim o As New Other()
        o.ShowSlotData()
    End Sub
    
End Class

Public Class Other
    Public Sub ShowSlotData()
        ' This method has no access to the data in the SlotExample
        ' class, but when executed by a thread it can obtain
        ' the thread's data from a named slot.
        Console.WriteLine("Other code displays data in thread_{0}'s data slot: {1,3}", _
            AppDomain.GetCurrentThreadId().ToString(), _
            Thread.GetData( _
            Thread.GetNamedDataSlot("Random")).ToString())
    End Sub
End Class

[C#] 
using System;
using System.Threading;

class Test
{
    static void Main()
    {
        Thread[] newThreads = new Thread[4];
        for(int i = 0; i < newThreads.Length; i++)
        {
            newThreads[i] = 
                new Thread(new ThreadStart(Slot.SlotTest));
            newThreads[i].Start();
        }
    }
}

class Slot
{
    static Random randomGenerator = new Random();

    public static void SlotTest()
    {
        // Set different data in each thread's data slot.
        Thread.SetData(
            Thread.GetNamedDataSlot("Random"), 
            randomGenerator.Next(1, 200));

        // Write the data from each thread's data slot.
        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", 
            AppDomain.GetCurrentThreadId().ToString(),
            Thread.GetData(
            Thread.GetNamedDataSlot("Random")).ToString());

        // Allow other threads time to execute SetData to show
        // that a thread's data slot is unique to the thread.
        Thread.Sleep(1000);

        Console.WriteLine("Data in thread_{0}'s data slot is still: {1,3}", 
            AppDomain.GetCurrentThreadId().ToString(),
            Thread.GetData(
            Thread.GetNamedDataSlot("Random")).ToString());

        // Allow time for other threads to show their data,
        // then demonstrate that any code a thread executes
        // has access to the thread's named data slot.        
        Thread.Sleep(1000);

        Other o = new Other();
        o.ShowSlotData();
    }
}

public class Other
{
    public void ShowSlotData()
    {
        // This method has no access to the data in the Slot
        // class, but when executed by a thread it can obtain
        // the thread's data from a named slot.
        Console.WriteLine("Other code displays data in thread_{0}'s data slot: {1,3}", 
            AppDomain.GetCurrentThreadId().ToString(), 
            Thread.GetData( 
            Thread.GetNamedDataSlot("Random")).ToString());
    }
}

[C++] 
#using <mscorlib.dll>
using namespace System;
using namespace System::Threading;

__gc class Other
{
public:
    void ShowSlotData()
    {
        // This method has no access to the data in the Slot
        // class, but when executed by a thread it can obtain
        // the thread's data from a named slot.
        Console::WriteLine("Other code displays data in thread_{0}'s data slot: {1,3}", 
            __box(AppDomain::GetCurrentThreadId()), 
            Thread::GetData( 
            Thread::GetNamedDataSlot("Random"))->ToString());
    }
};

__gc class Slot
{
    static Random* randomGenerator = new Random();

public:
    static void SlotTest()
    {
        // Set different data in each thread's data slot.
        Thread::SetData(
            Thread::GetNamedDataSlot(S"Random"), 
            __box(randomGenerator->Next(1, 200)));

        // Write the data from each thread's data slot.
        Console::WriteLine(S"Data in thread_{0}'s data slot: {1,3}", 
            AppDomain::GetCurrentThreadId().ToString(),
            Thread::GetData(
            Thread::GetNamedDataSlot(S"Random"))->ToString());

        // Allow other threads time to execute SetData to show
        // that a thread's data slot is unique to the thread.
        Thread::Sleep(1000);

        Console::WriteLine(S"Data in thread_{0}'s data slot is still: {1,3}", 
            AppDomain::GetCurrentThreadId().ToString(),
            Thread::GetData(
            Thread::GetNamedDataSlot(S"Random"))->ToString());

        // Allow time for other threads to show their data,
        // then demonstrate that any code a thread executes
        // has access to the thread's named data slot.        
        Thread::Sleep(1000);

        Other* o = new Other();
        o->ShowSlotData();
    }
};

void main()
{
    Thread* newThreads __gc[] = new Thread* __gc[4];
    for(int i = 0; i < newThreads->Length; i++)
    {
        newThreads[i] = new Thread(
            new ThreadStart(0, &Slot::SlotTest));
        newThreads[i]->Start();
    }
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

参照

Thread クラス | Thread メンバ | System.Threading 名前空間 | スレッドおよびスレッド処理 | スレッド ローカル ストレージおよびスレッドごとの相対静的フィールド