Post

🐒 8. Thread & Lock

🫧 동기화와 락

  • μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ μƒμ„±λœ μŠ€λ ˆλ“œλ“€μ€ 같은 λ©”λͺ¨λ¦¬ 곡간을 κ³΅μœ ν•¨
  • μŠ€λ ˆλ“œκ°€ μ„œλ‘œ 데이터λ₯Ό κ³΅μœ ν•  수 있음
  • 두 μŠ€λ ˆλ“œκ°€ 같은 μžμ›μ„ λ™μ‹œμ— λ³€κ²½ν•˜λŠ” κ²½μš°λŠ” λ¬Έμ œκ°€ λœλ‹€
  • synchronized
    • 곡유 μžμ›μ— λŒ€ν•œ 접근을 μ œμ–΄ν•¨
  • 락
    • μ„Έλ°€ν•˜κ²Œ 동기화λ₯Ό μ œμ–΄ν•¨
    • 락을 곡유 μžμ›μ— 뢙이면 ν•΄λ‹Ή μžμ›μ— λŒ€ν•œ 접근을 동기화 ν•  수 μžˆλ‹€
    • μŠ€λ ˆλ“œκ°€ ν•΄λ‹Ή μžμ›μ„ μ ‘κ·Όν•˜λ €λ©΄ μš°μ„  κ·Έ μžμ›μ— λΆ™μ–΄ μžˆλŠ” 락을 νšλ“ ν•΄μ•Ό 함
    • νŠΉμ • μ‹œμ μ— 락을 μ₯κ³  μžˆμ„ 수 μžˆλŠ” μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜ 뿐
    • ν•΄λ‹Ή 곡유 μžμ›μ€ ν•œ λ²ˆμ— ν•œ μŠ€λ ˆλ“œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯
  • κ΅μ°©μƒνƒœμ™€ κ΅μ°©μƒνƒœ 방지
    • 첫 번째 μŠ€λ ˆλ“œλŠ” 두 번째 μŠ€λ ˆλ“œκ°€ λ“€κ³  μžˆλŠ” 객체의 락이 풀리기λ₯Ό 기닀리고 있고, 두 번째 μŠ€λ ˆλ“œ μ—­μ‹œ 첫 번째 μŠ€λ ˆλ“œκ°€ λ“€κ³  μžˆλŠ” 객체의 락이 풀리기λ₯Ό κΈ°λ‹€λ¦¬λŠ” 상황
    • λͺ¨λ“  μŠ€λ ˆλ“œκ°€ 락이 풀리기λ₯Ό 기닀리고 있기 λ•Œλ¬Έμ—, λ¬΄ν•œ λŒ€κΈ° μƒνƒœμ— λΉ μ§€κ²Œ 됨
      • μƒν˜Έ 배체 (Mutual exclusion) : ν•œ λ²ˆμ— ν•œ ν”„λ‘œμ„ΈμŠ€λ§Œ 곡유 μžμ›μ„ μ‚¬μš©ν•  수 μžˆλ‹€
      • λ“€κ³  기닀리기 (Hold and wait) : 곡유 μžμ›μ— λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ„ κ°–κ³  μžˆλŠ” ν”„λ‘œμ„ΈμŠ€κ°€, κ·Έ μ ‘κ·Ό κΆŒν•œμ„ μ–‘λ³΄ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ λ‹€λ₯Έ μžμ›μ— λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ„ μš”κ΅¬ν•  수 μžˆλ‹€
      • μ„ μ·¨ (Preemption) λΆˆκ°€λŠ₯ : ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ› μ ‘κ·Ό κΆŒν•œμ„ κ°•μ œλ‘œ μ·¨μ†Œν•  수 μ—†λ‹€
      • λŒ€κΈ° μƒνƒœμ˜ 사이클 (Circular wait) : 두 개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ μžμ› 접근을 κΈ°λ‹€λ¦¬λŠ”λ°, κ·Έ 관계에 사이클이 μ‘΄μž¬ν•œλ‹€

🫧 C언어와 C++

  • ν΄λž˜μŠ€μ™€ 상속
    • C++ μ—μ„œ λͺ¨λ“  데이터 멀버와 λ©”μ„œλ“œλŠ” 기본적으둜 private
  • μƒμ„±μžμ™€ μ†Œλ©Έμž
    • μƒμ„±μžλŠ” 객체가 μƒμ„±λ˜λ©΄ μžλ™μœΌλ‘œ ν˜ΈμΆœλœλ‹€
    • μƒμ„±μžκ°€ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬λŠ” κΈ°λ³Έ μƒμ„±μžλΌκ³  λΆˆλ¦¬λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ λ§Œλ“ λ‹€
      1
      2
      3
      
      Person ( int a : id(a) {
      ...
      }
      
    • 데이터 λ©€λ²„μ˜ id λŠ” μ‹€μ œ 객체가 λ§Œλ“€μ–΄μ§€κΈ° μ „, μƒμ„±μž μ½”λ“œμ˜ λ‚˜λ¨Έμ§€ 뢀뢄이 μ‹€ν–‰λ˜κΈ° 전에 값을 ν• λ‹Ήλ°›λŠ”λ‹€
    • μ†Œλ©ΈμžλŠ” 객체가 μ†Œλ©Έλ  λ•Œ μžλ™μœΌλ‘œ 호좜되며, 객체λ₯Ό μ‚­μ œν•˜λŠ” μž‘μ—…μ„ λ‹΄λ‹Ήν•œλ‹€
      • λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” λ©”μ„œλ“œκ°€ μ•„λ‹ˆλ―€λ‘œ, 인자λ₯Ό 전달할 수 μ—†λ‹€
        1
        2
        3
        
        ~Person() {
          delete obj;
        }
        
  • 가상 ν•¨μˆ˜

    • λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ–΄λ–€ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄ λ‘˜ 수 μ—†λŠ” κ²½μš°μ—λ„ 가상 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€
    • 순수 가상 ν•¨μˆ˜λ‘œ μ„ μ–Έν•˜μ—¬ κ·Έ κ΅¬ν˜„μ€ ν•˜μœ„ ν΄λž˜μŠ€λ“€μ—κ²Œ 맑겨야 ν•œλ‹€
    • addCourse λ₯Ό 순수 가상 ν•¨μˆ˜λ‘œ μ„ μ–Έν•˜μ˜€μœΌλ―€λ‘œ, Person ν΄λž˜μŠ€λŠ” 슀슀둜 객체λ₯Ό λ§Œλ“€μ–΄ λ‚Ό 수 μ—†λŠ” 좔상 ν΄λž˜μŠ€κ°€ λœλ‹€
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    class Person {
    	int id;
    	char name[Name_size];
    public:
    	virtual void aboutMe() {
    		cout << "I am a person" << endl;
    	}
    	virtual bool addCourse(string s) = 0;
    };
    
    class Student : public Person {
    public:
    	void aboutMe() {
    		cout << "I am a Student|"" << endl;
    	}
    	bool addCourse(string s) {
    		cout << "Added course" << s << " to student " << endl;
    		return true;
    		}
    };
    
    int main() {
    	Person *p = new Student();
    	p -> aboutMe();
    	p -> addCourse("History");
    	delete p;
    }
    
  • 가상 μ†Œλ©Έμž
    • 가상 ν•¨μˆ˜μ˜ κ°œλ…μ—μ„œλΆ€ν„° μžμ—°μŠ€λŸ½κ²Œ μœ λ„ν•  수 μžˆλ‹€
  • κΈ°λ³Έκ°’
    • ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ–Ό 기본값을 λͺ…μ‹œν•  수 μžˆλ‹€
    • 기본값은 λ°˜λ“œμ‹œ ν•¨μˆ˜ μ„ μ–Έμ˜ 우츑 뢀뢄에 놓여야 ν•œλ‹€
      1
      2
      3
      4
      5
      
      int func(int a, int b = 3) {
        x = a;
        b = b;
        return a * b;
      }
      
  • μ—°μ‚°μž μ˜€λ²„λ‘œλ”©
    • μ—°μ‚°μžλ₯Ό 객체간 연산에도 μ‚¬μš©ν•  수 μžˆλ‹€
  • 포인터와 μ°Έμ‘°
    • ν¬μΈν„°λŠ” λ³€μˆ˜μ˜ μ£Όμ†Œλ₯Ό λ‹΄λŠ” λ³€μˆ˜
    • λ³€μˆ˜μ˜ 값을 μ½κ±°λ‚˜ λ³€κ²½ν•˜λŠ” λ“± λ³€μˆ˜μ— 적용 κ°€λŠ₯ν•œ 연산은 λͺ¨λ‘ 포인터λ₯Ό 톡해 ν•  수 μžˆλ‹€
    • 두 포인터가 같은 μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” κ²½μš°μ— ν•œ 포인터가 κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜λ©΄ λ‹€λ₯Έ 포인터가 κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜μ˜ 값도 바뀐닀
  • μ°Έμ‘°
    • λ³„λ„μ˜ λ©”λͺ¨λ¦¬λ₯Ό 갖지 μ•ŠλŠ”λ‹€-
    • μ°Έμ‘°λŠ” null 이 될 수 μ—†μœΌλ©°, λ‹€λ₯Έ λ©”λͺ¨λ¦¬μ— μž¬ν• λ‹Ή 될 μˆ˜λ„ μ—†λ‹€
  • 포인터 μ—°μ‚°
    • p++ λ₯Ό μ‹€ν–‰ν•˜λ©΄ pλŠ” size(int) λ°”μ΄νŠΈ
  • ν…œν”Œλ¦Ώ
    • ν•˜λ‚˜μ˜ 클래슀λ₯Ό μ„œλ‘œ λ‹€λ₯Έ μ—¬λŸ¬ νƒ€μž…μ— μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ 함
    • μ—¬λŸ¬ νƒ€μž…μ˜ 객체λ₯Ό μ €μž₯ν•  수 μžˆλŠ” μ—°κ²°λ¦¬μŠ€νŠΈμ™€ 같은 자료ꡬ쑰λ₯Ό λ§Œλ“€ 수 μžˆλ‹€
This post is licensed under CC BY 4.0 by the author.