C#

[C#] ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ κ°œλ… - Main μŠ€λ ˆλ“œ 정보 좜λ ₯ν•˜κΈ°

hyonie 2024. 6. 2. 20:32

μŠ€λ ˆλ“œλŠ” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ, ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ³‘λ ¬λ‘œ 싀행될 수 μžˆλ‹€. μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ CPU μ‚¬μš©λ₯ μ„ 높이고, 응닡성을 κ°œμ„ ν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μŠ€λ ˆλ“œλ₯Ό μ˜¬λ°”λ₯΄κ²Œ κ΄€λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ 동기화 λ¬Έμ œλ‚˜ ꡐ착 μƒνƒœ(deadlock) λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒ ν• μˆ˜ μžˆλ‹€. C#μ—μ„œμ˜ μŠ€λ ˆλ“œμ˜ κ°œλ…μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

 

 


ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ

λ©”λͺ¨λ¦¬μ— μ˜¬λΌμ™€ μ‹€ν–‰λ˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό ν”„λ‘œμ„ΈμŠ€λΌκ³  ν•œλ‹€.

 


ν”„λ‘œμ„ΈμŠ€λž€?

  • ν”„λ‘œμ„ΈμŠ€μ˜ μ •μ˜: ν”„λ‘œκ·Έλž¨μ„ μ‹œμž‘ν•˜λ©΄ λ©”λͺ¨λ¦¬μ— μ‹€ν–‰λ˜λ„λ‘ μ˜¬λ €μ§€λŠ” 것이 ν”„λ‘œμ„ΈμŠ€μ΄λ‹€. 예λ₯Ό λ“€μ–΄, νŒŒμ›Œν¬μΈνŠΈλ‚˜ μœˆλ„μš° λ―Έλ””μ–΄ ν”Œλ ˆμ΄μ–΄κ°€ μ‹€ν–‰λ˜λ©΄ 각각의 ν”„λ‘œμ„ΈμŠ€κ°€ λœλ‹€. 
  • μž‘μ—… κ΄€λ¦¬μž: μž‘μ—…κ΄€λ¦¬μž(Task Manager)μ—μ„œ μ‹€ν–‰ 쀑인 λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€λ₯Ό 볼수 μžˆλ‹€.
  • λ©€ν‹°ν”„λ‘œμ„ΈμŠ€: μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 것을 λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λΌκ³  ν•œλ‹€.

 

CPU와 λ©”λͺ¨λ¦¬ : μ—°μ‚°μ˜ 쀑심과 λ°μ΄ν„°μ˜ μ €μž₯μ†Œ πŸ–₯️

  • CPU의 λ™μž‘: CPUλŠ” ν•˜λ“œλ””μŠ€ν¬μ˜ λ‚΄μš©μ„  직접 μ•Œμˆ˜ μ—†λ‹€. λŒ€μ‹ , λ©”λͺ¨λ¦¬(RAM)에 μžˆλŠ” 데이터λ₯Ό μ°Έμ‘°ν•˜μ—¬ 연산을 μˆ˜ν–‰ν•œλ‹€.

λ©€ν‹°ν”„λ‘œμ„Έμ‹±κ³Ό μŠ€μΌ€μ€„λ§: λ™μ‹œμ„±μ„ ν†΅ν•œ 효율적인 μ‹€ν–‰ πŸ”„οΈ

  • 운영체제의 μŠ€μΌ€μ€„λ§: 운영체제(OS)λŠ” μŠ€μΌ€μ€„λ§μ„ 톡해 μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ²ˆκ°ˆμ•„κ°€λ©° μ‹€ν–‰ν•œλ‹€. 이둜 인해 μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보인닀. 이λ₯Ό λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ΄λΌκ³  ν•œλ‹€.

λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ μŠ€λ ˆλ“œ ν™œμš©: 병렬 μž‘μ—…μœΌλ‘œμ˜ μ „ν™˜ 🌐

슀트리밍 μ„œλΉ„μŠ€μ—μ„œ 데이터λ₯Ό μˆ˜μ‹ ν•˜κ³  μ†‘μ‹ ν•˜λŠ” μž‘μ—…μ„ 각각의 μŠ€λ ˆλ“œλ‘œ λ‚˜λˆ„μ–΄ λ³‘λ ¬λ‘œ μ‹€ν–‰ ν•  수 μžˆλ‹€.

즉, μŠ€λ ˆλ“œμ˜ 역할은 λ™μ‹œμ— μ‹€ν–‰λ˜μ–΄μ•Όν•˜λŠ” μž‘μ—…μ€ μŠ€λ ˆλ“œλ‘œ λ§Œλ“€μˆ˜ μžˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 각 μž‘μ—…μ΄ λ³‘λ ¬λ‘œ μˆ˜ν–‰λœλ‹€.

  • λ°›λŠ” 루틴: 데이터λ₯Ό μˆ˜μ‹ ν•˜λŠ” μŠ€λ ˆλ“œ
  • λ³΄λ‚΄λŠ” 루틴: 데이터λ₯Ό μ†‘μ‹ ν•˜λŠ” μŠ€λ ˆλ“œ

μš°λ¦¬κ°€ μ‚¬μš©ν–ˆλ˜ μŠ€λ ˆλ“œλŠ” λ¬΄μ—‡μΌκΉŒ? : μŠ€λ ˆλ“œμ˜ μ—­ν• κ³Ό ν™œμš©βš™οΈ

λ©”μΈν•¨μˆ˜λŠ” 기본적으둜 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λœλ‹€. μΆ”κ°€λ‘œ λ‹€λ₯Έ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ—¬ 병렬 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

μŠ€λ ˆλ“œλ₯Ό ν™œμš©ν•˜λ©΄ λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ„ 효율적으둜 μ²˜λ¦¬ν•  수 있으며, 이λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.

 

 


 

μŠ€λ ˆλ“œμ˜ κ°œλ…

 

  • μŠ€λ ˆλ“œ: ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” μ—¬λŸ¬ 흐름 λ‹¨μœ„λ₯Ό μŠ€λ ˆλ“œλΌκ³  ν•œλ‹€.
  • λ©€ν‹°μŠ€λ ˆλ“œ: ν•œ 개의 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œκ°€ λ…λ¦½μ μœΌλ‘œ μˆ˜ν–‰λ˜λŠ” 것을 λ©€ν‹° μŠ€λ ˆλ“œλΌκ³ ν•œλ‹€.
  • 메인 ν•¨μˆ˜ μžμ²΄κ°€ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ΄λ‹€. μ—¬λŸ¬κ°œμ˜ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— λ™μž‘ν•  수 μžˆλ‹€.

 

 

 


 

System.Threading λ„€μž„ 슀페이슀

λ‹·λ„·μ—μ„œ μŠ€λ ˆλ“œ κ΄€λ ¨ κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•œ 라이브러리둜 System.Threading λ„€μž„ μŠ€νŽ˜μ΄μŠ€κ°€ μžˆλ‹€.

 

동기화

Interlocked, Monitor, Mutex μŠ€λ ˆλ“œ 동기화 객체이닀. μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ μ΄λŸ¬ν•œ λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•œλ‹€.

μ£Όμš”κΈ°λŠ₯ λ‚΄μš©
Interlocked μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” λ³€μˆ˜λ₯Ό μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ„λ‘ 도와쀀닀. 예λ₯Ό λ“€μ–΄, 두 μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 숫자λ₯Ό μ¦κ°€μ‹œν‚€λ €κ³  ν•  λ•Œ μΆ©λŒμ„ ν”Όν•˜κ²Œ ν•œλ‹€.
Monitor `lock`, `wait`, `signal`을 μ‚¬μš©ν•˜μ—¬ ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ νŠΉμ • μ½”λ“œλ₯Ό μ‹€ν–‰ν• μˆ˜ μžˆλ„λ‘ ν•œλ‹€.
- lock: λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 λ§‰μŒ
- wait: μŠ€λ ˆλ“œκ°€ νŠΉμ • 쑰건이 될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬κ²Œ 함.
- signal: 기닀리고 μžˆλŠ” μŠ€λ ˆλ“œμ—κ²Œ μ§„ν–‰ν•˜λΌκ³  μ‹ ν˜Έλ₯Ό 보냄
Mutex μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μžμ›μ„ μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 두 μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— νŒŒμΌμ— μ“°μ§€ λͺ»ν•˜λ„둝 ν•œλ‹€.

 

μŠ€λ ˆλ“œ κ΄€λ ¨ ν΄λž˜μŠ€μ™€ κΈ°λŠ₯

μ£Όμš”κΈ°λŠ₯ λ‚΄μš©
Thead μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰μ‹œν‚€λŠ” κΈ°λŠ₯을 제곡
예: μƒˆ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€μ–΄μ„œ νŠΉμ • μž‘μ—…μ„ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μˆ˜ν–‰
TheadPool μŠ€λ ˆλ“œ ν’€ λ‚΄μ˜ μŠ€λ ˆλ“œλ“€μ„ μž¬μ‚¬μš©ν•˜μ—¬ 효율적으둜 μž‘μ—…μ„ μ²˜λ¦¬ν•œλ‹€. μƒˆ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” λŒ€μ‹  κΈ°μ‘΄ μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©
Timer μΌμ •ν•œ μ‹œκ°„ κ°„κ²©μœΌλ‘œ λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•œλ‹€.
예: λ§€ 1μ΄ˆλ§ˆλ‹€ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ„λ‘ μ„€μ •

 

델리게이트

μ£Όμš”κΈ°λŠ₯ λ‚΄μš©
ThreadStart μŠ€λ ˆλ“œμ—μ„œ 싀행될 λ©”μ†Œλ“œλ₯Ό μ§€μ •ν•˜λŠ” 델리게이트
예: `Thread thread = new Thread(new ThreadStart(MyMethod))`
WaitCallback νƒ€μ΄λ¨Έλ‚˜ μŠ€λ ˆλ“œ ν’€μ—μ„œ 호좜될 λ©”μ†Œλ“œλ₯Ό μ§€μ •ν•˜λŠ” 델리게이트

 

μŠ€λ ˆλ“œ 속성

μ£Όμš”κΈ°λŠ₯ λ‚΄μš©
ThreadState μŠ€λ ˆλ“œμ˜ ν˜„μž¬ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 예λ₯Ό λ“€μ–΄, μ‹€ν–‰ 쀑, λŒ€κΈ° 쀑, 쀑지됨 λ“±
ThreadPriority μŠ€λ ˆλ“œμ˜ μ‹€ν–‰ μš°μ„ μˆœμœ„λ₯Ό μ§€μ •ν•œλ‹€. 예λ₯Όλ“€μ–΄, μ€‘μš”ν•œ μž‘μ—…μ„ 더 빨리 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μš°μ„ μˆœμœ„λ₯Ό 높일 수 μžˆλ‹€.

 

 


 

μŠ€λ ˆλ“œ 정보 좜λ ₯ν•˜κΈ°

 

μŠ€λ ˆλ“œ 정보λ₯Ό ν…μŠ€νŠΈ λ°•μŠ€μ— 좜λ ₯ν•œλ‹€.

 

1. Form1.cs 배치

  • TextBox 배치
    • Name: txtThreadInfo
    • MultiLine: True
  • Button 배치
    • Name: btnThreadInfo
    • Text: μŠ€λ ˆλ“œ 정보

μŠ€λ ˆλ“œ 정보 λ²„νŠΌ 클릭 ν›„ 좜λ ₯된 μŠ€λ ˆλ“œ 정보

2. 이벀트 ν•Έλ“€λŸ¬ 생성

// μŠ€λ ˆλ“œλŠ” λ©”μΈμŠ€λ ˆλ“œ or μ£ΌμŠ€λ ˆλ“œλ‘œ 쑴재 
// μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΆ”κ°€
using System.Threading; 

private void btnThreadInfo_Click(object sender, EventArgs e)
{

    Thread th = Thread.CurrentThread; // μŠ€λ ˆλ“œ 객체 생성
    th.Name = "threadInfo"; // μŠ€λ ˆλ“œ 이름 μ„€μ •

    txtThreadInfo.Text += "μŠ€λ ˆλ“œ 이름: " + th.Name + "\r\n";
    txtThreadInfo.Text += "μŠ€λ ˆλ“œ μš°μ„ μˆœμœ„: " + th.Priority + "\r\n";
    txtThreadInfo.Text += "μŠ€λ ˆλ“œ μƒνƒœ: " + th.ThreadState + "\r\n";

}

 

F12 + CurrentThread 객체λ₯Ό 보면 ν˜„μž¬ μ‹€ν–‰λ˜λŠ” μŠ€λ ˆλ“œλ₯Ό 보여쀀닀. 정적인 λ©”μ†Œλ“œλ‘œ get,set ν”„λ‘œνΌν‹°(get,set을 ν•˜λ‚˜λ‘œ λ§Œλ“ κ²ƒ)이닀. C++μ—μ„œλŠ” Thread th = Thread::CurrentThread; 와 같이 ν˜ΈμΆœν•œλ‹€. 

 

 

F12 + Name μ—μ„œλ„ μŠ€λ ˆλ“œμ˜ 이름을 μ„€μ •ν•˜λŠ” Name이 get,set의 ν”„λ‘œνΌν‹°λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. th.Name = "이름"; set name이 λ°œλ™λ˜μ„œ value 값이 μž…λ ₯λœλ‹€.

 

3. ν”„λ‘œκ·Έλž¨ μ‹œμž‘ μ‹œ 기본적으둜 μƒμ„±λ˜λŠ” Main μŠ€λ ˆλ“œμ˜ μƒνƒœ 좜λ ₯

μŠ€λ ˆλ“œ μƒνƒœλ₯Ό TextBoxμ—μ„œ 좜λ ₯ν•΄λ³Έλ‹€. (μ„€μ •ν•œ 이름, μš°μ„ μˆœμœ„, μŠ€λ ˆλ“œ μƒνƒœ)

μš°μ„ μˆœμœ„λŠ” 기본값이 Normal이닀. μŠ€λ ˆλ“œ μƒνƒœκ°€ Running으둜 λ™μž‘ν•˜κ³  μžˆλ‹€.

 

방금 μŠ€λ ˆλ“œλ₯Ό λ§Œλ“ μ μ΄ μ—†λ‹€. 그말은 CurrentThread둜 정보λ₯Ό μ–»μ–΄μ™”λŠ”λ°, 일반적으둜 ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘λ˜λ©΄ Main() λ©”μ„œλ“œκ°€ μžˆλŠ” μŠ€λ ˆλ“œκ°€ μƒμ„±λ˜κ³  μ‹€ν–‰λœλ‹€λŠ” 것이닀.

μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ§€μ•Šμ•„λ„ 기본적으둜 λ™μž‘ν•œλ‹€. Program.cs κ°€λ©΄ Main()λ©”μ„œλ“œ μžμ²΄κ°€ λ©”μΈμŠ€λ ˆλ“œμ΄λ‹€.

 

λ©”μΈμŠ€λ ˆλ“œ μ•ˆμ—μ„œ κΈ°λŠ₯을 μΆ”κ°€ν•œλ‹€κ³  μŠ€λ ˆλ“œκ°€ λ˜μ§€μ•ŠλŠ”λ‹€.

이 μ½”λ“œλ‘œ μ•Œμˆ˜ μžˆλŠ” 사싀은 μš°λ¦¬κ°€ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„, 기본적으둜 λ©”μΈμŠ€λ ˆλ“œκ°€ λ™μž‘ν•˜κ³  있고, μŠ€λ ˆλ“œμ˜ 정보듀을 κ°€μ Έμ˜¬μˆ˜ μžˆλ‹€λŠ” 것이닀..