μ€λ λλ νλ‘κ·Έλ¨μ μ€ν λ¨μλ‘, νλμ νλ‘μΈμ€ λ΄μμ μ¬λ¬ μ€λ λκ° λ³λ ¬λ‘ μ€νλ μ μλ€. μ€λ λλ₯Ό μ¬μ©νλ©΄ 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()λ©μλ μμ²΄κ° λ©μΈμ€λ λμ΄λ€.
λ©μΈμ€λ λ μμμ κΈ°λ₯μ μΆκ°νλ€κ³ μ€λ λκ° λμ§μλλ€.
μ΄ μ½λλ‘ μμ μλ μ¬μ€μ μ°λ¦¬κ° μ€λ λλ₯Ό λ§λ€μ§ μμλ, κΈ°λ³Έμ μΌλ‘ λ©μΈμ€λ λκ° λμνκ³ μκ³ , μ€λ λμ μ 보λ€μ κ°μ Έμ¬μ μλ€λ κ²μ΄λ€..
'C#' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C#] λ€μν λ°μ΄ν° νμμ μ²λ¦¬νλ μΌλ°ν νλ‘κ·Έλλ° (0) | 2024.09.01 |
---|---|
[C#] μμ νκ³ ν¨μ¨μ μΈ μ€λ λ μμ± λ° μ’ λ£ λ°©λ² (1) | 2024.06.03 |
[C#] κ·Έλν½ GDI+ κ°λ κ³Ό κ°λ¨ν λν 그리기 (0) | 2024.05.22 |
[C#] μ±κΈν€ ν¨ν΄ μ΄ν΄νκΈ° - C++, C# λΉκ΅ (1) | 2024.05.21 |
[C#] μΌλ°νλ μ λ€λ¦ νλ‘κ·Έλλ°κ³Ό 컬λ μ μ νμ© (1) | 2024.05.15 |