[c#] C# 스레드 프로세스 간 통신 (IPC)

C#은 여러 스레드나 프로세스 간 효율적으로 데이터를 교환할 수 있는 다양한 방법을 제공합니다. 이러한 방법들을 사용하여 애플리케이션의 성능을 최적화하고 데이터를 안전하게 공유할 수 있습니다.

1. 스레드 간 통신

1.1. 공유 메모리 공간

공유 메모리를 이용하여 스레드 간 데이터를 교환하는 것이 일반적입니다. C#에서는 MemoryMappedFile 클래스를 사용하여 공유 메모리를 생성하고 접근할 수 있습니다. 이를 통해 여러 스레드가 동시에 메모리에 접근하고 데이터를 공유할 수 있습니다.

// 공유 메모리 생성
using (var mmf = MemoryMappedFile.CreateNew("SharedMemory", 10000))
{
    // 공유 메모리에 데이터 쓰기
    using (var stream = mmf.CreateViewStream())
    {
        var writer = new BinaryWriter(stream);
        writer.Write("Hello, shared memory!");
    }
}

1.2. 파이프

파이프는 두 개의 프로세스 간에 통신할 수 있는 방법 중 하나입니다. C#에서는 NamedPipeServerStreamNamedPipeClientStream 클래스를 사용하여 파이프를 생성하고 통신할 수 있습니다.

서버 측:

// 파이프 서버 생성
var server = new NamedPipeServerStream("PipeName", PipeDirection.InOut);
server.WaitForConnection();

// 파이프로 데이터 전송
var writer = new StreamWriter(server);
writer.WriteLine("Hello from server!");
writer.Flush();

클라이언트 측:

var client = new NamedPipeClientStream(".", "PipeName", PipeDirection.InOut);
client.Connect();

var reader = new StreamReader(client);
string data = reader.ReadLine();

2. 프로세스 간 통신

2.1. 원격 프로시저 호출 (RPC)

원격 프로시저 호출을 통해 다른 프로세스나 컴퓨터에서 메서드를 호출할 수 있습니다. C#에서는 System.Runtime.Remoting 네임스페이스를 사용하여 RPC를 구현할 수 있습니다.

// 원격 객체 생성
MyRemoteObject remoteObject = (MyRemoteObject)Activator.GetObject(
    typeof(MyRemoteObject),
    "tcp://localhost:8085/MyRemoteObjectName");

// 원격 메서드 호출
remoteObject.MyMethod();

2.2. 소켓 통신

소켓을 사용하여 네트워크를 통해 데이터를 교환할 수 있습니다. C#에서는 Socket 클래스를 사용하여 소켓 통신을 구현할 수 있습니다.

// 소켓 생성
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// ...   

C#에서는 스레드나 프로세스 간 통신을 위한 다양한 방법을 제공하며, 개발자는 애플리케이션의 요구 사항에 맞게 적절한 방법을 선택할 수 있습니다.

참고 문헌: